angularjs - 用 promise 装饰器包装 $http 调用

标签 angularjs decorator q

我有一个 Angular 服务,我用它来与我的后端进行通信,如下所示:

getMyBooks: function(userId) {
  var deferred = $q.defer();
  $http.get('/api/users/' + userId + '/books')
    .success(function(data) {
      deferred.resolve(data);
    }).error(function(data) {
      deferred.reject(data);
    });
  return deferred.promise;
},

然而,在这些函数中的 6 个左右之后,代码开始变得笨拙。

所以我尝试使用装饰器模式重构它,松散地从这里复制加倍装饰器:http://javascript.info/tutorial/decorators

给我更新后的代码:

var bookService = function ($http, $q, $filter) {

  var deferredwrapper = function(f) {
      return function() {
        var deferred = $q.defer();
        f.apply(this, arguments)
          .success(function(data) {
            deferred.resolve(data);
          }).error(function(data) {
            deferred.reject(data);
          });
        return deferred.promise;
      }
  };

  var funcs = {
    getBooks: deferredwrapper(
       function(userId) { $http.get('/api/users/' + userId + '/books') }
    )
  };

  return {
    getMyBooks: function() { funcs.getBooks }
  }
};

然而,这只会导致大量错误并返回大量未定义的内容。我想我在应该调用它或其他东西时传递了一个函数,但我完全不知道如何使它工作

最佳答案

你让自己的生活变得太复杂了。只需使用 promise 链:

getMyBooks: function(userId) {
  return $http.get('/api/users/' + userId + '/books').then(function(response) {
    return response.data;
  }).catch(function(response) {
    return $q.reject(response.data);
  });
}

也就是说,您的技术不起作用,因为您作为参数传递给 deferredwrapper() 的函数不返回任何内容。并且包装器期望该函数返回一个 HTTP promise 。改变

function(userId) { $http.get('/api/users/' + userId + '/books') }

function(userId) { return $http.get('/api/users/' + userId + '/books'); }

您在返回服务时犯了同样的错误:您正在分配一个既不执行也不返回任何内容的函数给 getMyBooks。改成

getMyBooks: funcs.getBooks

关于angularjs - 用 promise 装饰器包装 $http 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32022616/

相关文章:

javascript - 当异步设置集合时,angular 1.3 中的 ng-option 会忘记 ngmodel

python - 运行类的每个方法后修改实例变量的最佳方法?

python - 如何使用包装器在函数外部打印文档字符串?

javascript - Q.Promise : How to throw exception in callback correctly?

javascript - ES6 Promises - 在不使用延迟的情况下,我如何保证最终访问在 React componentDidMount 函数期间实例化的对象?

javascript - 基于变量数组顺序执行异步方法

javascript - 如何比较 ng-repeat 中的两个不同对象

javascript - 使用指令编辑 html 文本值

javascript - 编辑对传递参数的引用不会更新模型

python - 在装饰器包装器函数中访问装饰器参数