2016-11-03 20 views
0

我想簡化下面的AngularJs代碼,特別是$q.defer()promise方法。

我看到一個博客給出了$q.defer()here的錯誤使用的一些例子,並希望您在下面重寫我的代碼時遵循這個更簡單的方法。

這是來自博客的例子:

此:

var defer = $q.defer(); 
$http.get('options.json').success(function(result) { 
    defer.resolve(result); 
}); 
return defer.promise; 

可以更改爲:

return $http.get('options.json').then(function(response) { 
    return response.data; 
}); 

下面是3個功能(允許調用它對於本例 「階段」)從3個不同的服務,以返回適當的數據:

階段1:SocialMediaUserService

this.checkSocialMediaSubscription = function() { 

    var isSubscribed = $q.defer(); 

    GetUserAccessService.returnBrandProfileID().then(function (brandProfileID) { 

     if (brandProfileID === 0) { 
      isSubscribed.resolve(false); 
     } 

     else { 
      isSubscribed.resolve(true); 
     } 
    }); 

    return isSubscribed.promise; 
}; 

階段2: GetUserAccessService

this.returnBrandProfileID = function() { 

    var brandProfileID = $q.defer(); 

    if (angular.isUndefined($sessionStorage.brandProfileID)) { 

     GetDataService.getItems('GetUserAccess/' + $cookies.get('authenticationID')) 

     .success(function (accessObject) { 

      $sessionStorage.brandProfileID = accessObject.FusewareID; 
      brandProfileID.resolve(accessObject.FusewareID); 
     }) 

     .error(function (error, status) { 
      console.error('Fuseware API error: ' + error + ' Status message: ' + status); 
     }); 
    } 

    else { 
     brandProfileID.resolve($sessionStorage.brandProfileID); 
    } 

    return brandProfileID.promise; 

}; 

第3階段:GetDataS ervice

.factory('GetDataService', ['$http', 'WebServiceURL', function ($http, WebServiceURL) { 

    var DataFactory = {}; 

    DataFactory.getItems = function (ServiceParameter) { 

     console.log(WebServiceURL + '/' + ServiceParameter); 

     return $http.get(WebServiceURL + '/' + ServiceParameter, { cache: true }); 

    }; 

    return DataFactory; 

    } 
+1

除了Tobi已經說過的之外,你可以檢查一些圖書館,這些圖書館可以幫助你鏈接如下的承諾:https://github.com/kriskowal/q或https://github.com/petkaantonov/bluebird –

+0

謝謝參考! – onmyway

回答

1

一般來說,你應該忽略$ q.defer如果您已經有您正在使用的功能和槓桿承諾鏈接,而不是工作的承諾。

我舉一個例子你的第1階段:

function() { 
    return GetUserAccessService.returnBrandProfileID().then(function (brandProfileID) { 

     if (brandProfileID === 0) { 
      return false; 
     } 
     else { 
      return true; 
     } 
    }); 
} 

我們這裏使用的是什麼,你只可以使用。然後回調函數將內部解決返回的承諾里面的「迴歸」通過。然後。這就是爲什麼我們可以在主函數中返回鏈式諾言而不是$ q.defer()。

加成:看它是這樣的:你的。然後回調中返回的任何值將被包裝成Promise.resolve,當它是不是已經一個,這將創建一個基於價值的承諾。