【问题标题】:Using .always().error() syntax for Angular $q promises对 Angular $q 承诺使用 .always().error() 语法
【发布时间】:2013-12-25 13:53:37
【问题描述】:

我只是为我们的 REST API 实现了一个围绕 $http 的瘦包装器,我希望它以与 $http 相同的方式返回一个承诺(在我处理数据之后)。

这是我的服务:

Services.service('Item', ['$http', '$q', function($http, $q){
    var deferred = $q.defer();
    var getSuccess = function(data, status, headers, config){
        var item = angular.copy(data);
        item.primaryImage = 'https://my.cdn.com/' + item.meta.images[0].s3id;

        if(item.meta.source_link !== null) {
            item.sourceLink = item.meta.source_link.url;
        }

        deferred.resolve(item, data, status, headers, config);
    };
    var getError = function(data, status, headers, config) {
        deferred.reject(data, status, headers, config);
    };

    this.get = function(userID, itemID) {
        $http({
            method: 'GET',
            url: '/api/items/' + userID + '/' + itemID
        }).success(getSuccess).error(getError);

        return deferred.promise;
    };
}]);

但根据我对documentation 的理解,我必须使用.then(success, error, always) 而不是.success().error().always(),就像我可以使用$http 一样。

是否可以像$http 那样实现承诺?我很想这样做

var req = Item.get($routeParams.userID, $routeParams.itemID);

req.success(function(item){
        window.console.log('Got an item!', item);
    });
    .error(function(item){
        window.console.log('Damn. It failed.')
    })

【问题讨论】:

  • 两种承诺形式是否应该相同iff新的承诺没有被引入?

标签: javascript angularjs promise q


【解决方案1】:

这个问题让我在了解你真正想要的东西后搜索了一下。

我做了一个 plnkr 来展示我是如何解决这个问题的:http://plnkr.co/edit/LoCuwk26MEZXsugL1Ki5

现在,重要的部分是:

var promise = defered.promise;

  promise.success = function(fn) {
    promise.then(function(res) {
      fn(res);
    });
    return promise;
  };

  promise.error = function(fn) {
    promise.then(null, function(err) {
      fn(err);
    });
    return promise;
  };


  return promise

此代码直接来自angular source code。因此,如果您想复制这种风格,我相信这是要走的路。

不过,我确实注意到您的代码中有一个错误。所有服务都是单例的。这意味着您只创建一个延迟对象。您应该在每次调用时创建一个并使用它。

【讨论】:

  • 感谢您发现这个问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 2013-05-23
  • 2017-03-18
  • 2015-02-25
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多