如何使用 .success 和 .error 在 Angularjs 中扩展 $q 承诺 [英] How can I extend $q promise in Angularjs with a .success and .error

查看:24
本文介绍了如何使用 .success 和 .error 在 Angularjs 中扩展 $q 承诺的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I wrote this little code in a custom service in 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 服务.

I juste Handle the Success and Error from the promise ($q service). I need this code in a lot of other service so I would to extend directly the $q service with a custom.

所以我希望在我的服务中有这样的东西:

So I would like something like this in my service:

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

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

    return promise;

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

Any idea? I found some explanation to extend filter in Angularjs my problem is to find the good way to extend all the functionality of the $q and add my custom.

我从类似的东西开始,开箱即用地处理 $q 是可行的:

I start with something like that, it's work to handle the $q out of the box :

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

  $qCustom = $q;  

});

推荐答案

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

Here's a full solution picking up where @jessegavin left off.

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;
  });

});

这篇关于如何使用 .success 和 .error 在 Angularjs 中扩展 $q 承诺的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆