【问题标题】:$q decorator with extra "success" method lost in promise chaining带有额外“成功”方法的 $q 装饰器在承诺链中丢失
【发布时间】:2018-02-28 03:32:42
【问题描述】:

我在我的 angularJS 中有一个 '$q' 的装饰器,它以这种方式添加了一些额外的方法:

  angular
  .module('myApi', [])
  .config(function ($provide) {
    $provide.decorator('$q', function ($delegate) {
      var defer = $delegate.defer;
      $delegate.defer = function () {
        var deferred = defer();
        deferred.promise.success = function (fn) {
          deferred.promise.then(function(response) {
            fn(response.data, response.status, response.headers);
          });
          return deferred.promise;
        };
        return deferred;
      };
      return $delegate;
    });
  });

但是当我在 api 中执行此操作时,该方法消失了:

var DataFactoryBase =  {

  get: function (url, headers) { 
    var dfr = $q.defer();
    dfr.resolve( api_bridge ({
      execute: function () {
        return $q.resolve($http.get(url, {headers: headers}));
      } 
    }));
    //this line still holds the decorator method
    var withSuccessMethod = dfr.promise;
    //this line returns a promise without the decorator methods
    var lostSuccessMethod = dfr.promise.then(handlerSuccessResponse, handlerErrorResponse);
    return lostSuccessMethod;
  }

}

function handlerSuccessResponse(response) {
  //do stuff
  return $q.resolve(response);
}    


function handlerErrorResponse(response) {
  //do stuff
  return $q.reject(response.data); 
}

我怎样才能让 .then 也用成功方法返回一个承诺?

【问题讨论】:

    标签: angularjs promise decorator extend


    【解决方案1】:

    发现 promise 和 defer 是两个不同的东西(尽管后者使用前者)。更改调用 .then 时返回的承诺需要访问延迟中的底层承诺。可以用Object.getPrototypeOf()完成

      angular
      .module('myApi', []).config(function ($provide) {
        $provide.decorator('$q', function ($delegate) {
          var defer = $delegate.defer;
          $delegate.defer = function () {
            var deferred = defer();
            Object.getPrototypeOf(deferred.promise).success = function(callback) { 
              /* code */
            }
            return deferred;
          };
          return $delegate;
        });
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 2015-04-15
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多