簡體   English   中英

簡化使用$ q.defer()承諾鏈接的Angular函數

[英]Simplify Angular Functions that uses $q.defer() to promise chaining

我想簡化以下AngularJs代碼,尤其是$q.defer()promise方法。

我看到一個博客在此處給出了$q.defer()錯誤使用的一些示例,並且希望您在下面輸入我的代碼並重寫我的代碼以遵循此更簡單方法的提示。

這是來自Blog的示例:

這個:

 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:GetDataService

.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;

  }

通常,如果您已經在函數中使用過諾言,則應忽略$ q.defer,而應采用諾言鏈接。

我將為您的階段1舉例:

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

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

我們在這里使用的是,您只可以在.then函數回調中使用“ return” 這將在內部解決.then返回的promise。 這就是為什么我們可以在主函數中返回鏈接的promise而不是$ q.defer()的原因。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM