简化使用$q.defer()进行承诺链接的Angular函数



我想简化下面的AngularJs代码,特别是$q.defer()promise方法。

我在这里看到了一个博客给出了一些错误使用$q.defer()的例子,并将感谢您的输入和提示,以便在下面重写我的代码以符合这个更简单的方法。

这是一个来自博客的例子:

:

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个函数(在这个例子中我们称之为"stages")来返回相应的数据:

阶段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;
};

Stage 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;
};

Stage 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;
        }
     });
}
我们在这里使用的是,你可以在中使用"return"。then函数回调,将在内部解析.then返回的承诺。这就是为什么我们可以在主函数中返回链式承诺而不是$q.defer()。

加法:这样看:在中返回的任何值。那么回调将被包装到Promise中。

最新更新