一尘不染

我如何使用.success和.error扩展Angularjs中的$ q promise

angularjs

我在AngularJS的自定义服务中编写了这段小代码。

为我服务:

        var deferred = $q.defer();
        var promise = deferred.promise;

        deferred.resolve('success');
        deferred.reject('error');

        /* Handle success and error */
        promise.success = function(fn) {

            promise.then(function(response) {

                fn(response);

            });

            return promise;
        };

        promise.error = function(fn) {

            promise.then(null, function(response) {

                fn(response);

            });

            return promise;
        };

在我的控制器中:

        promiseService.myPromise()
            .success(function(data){

                $scope.success= data;

            })
            .error(function(data){

                $scope.error = data;

            });

我只是处理诺言中的成功和错误($ q服务)。我在许多其他服务中都需要此代码,因此我将使用自定义直接扩展$ q服务。

因此,我希望在服务中提供以下信息:

    var deferred = myPromiseService.$qCustom.defer();
    var promise = deferred.promise;

    deferred.resolve('success');
    deferred.reject('error');

    return promise;

任何想法?我在Angularjs中找到了一些扩展过滤器的解释,我的问题是找到扩展$ q的所有功能并添加自定义的好方法。

我从这样的事情开始,开箱即用地处理$ q是可行的:

angular.module('myApp').service('myPromiseService', function($q){

  $qCustom = $q;

});

阅读 261

收藏
2020-07-04

共1个答案

一尘不染

这是一个完整的解决方案,可从@jessegavin停止的地方开始。

var myApp = angular.module("myApp", []);

myApp.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;
      };
      deferred.promise.error = function (fn) {
        deferred.promise.then(null, function(response) {
          fn(response.data, response.status, response.headers);
        });
        return deferred.promise;
      };
      return deferred;
    };
    return $delegate;
  });

});
2020-07-04