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

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

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

我看到一篇博客提供了一些错误使用 $q.defer() here 的示例,非常感谢您在重写下面的代码以符合这种更简单的方法时提供的意见和提示。

This is an example from the Blog:

This:

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

can be changed to:

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

下面是从 3 种不同的服务到 return 适当数据的 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;
};

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

  }

一般来说,如果您已经有一个在函数中使用的 promise,您应该省略 $q.defer 并改为利用 promise 链。

我将为您的第 1 阶段举个例子:

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

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

我们在这里使用的是,您可以在 .then 函数回调中使用 "return",它将在内部解决 return 由 .然后.这就是为什么我们可以 return 链式承诺而不是主函数中的 $q.defer()。

Addition:这样看:你在 .then 回调中 return 的任何值都将被包装到Promise.resolve 这将创建一个基于值的承诺,当它还不是一个时。