是否可以为承诺提供默认的errorCallback?

时间:2017-03-17 05:46:12

标签: javascript angularjs angular-promise

有没有办法为promise提供默认的errorCallback,这样如果用户提供了errorCallback,默认的errorCallback就会调用而不是

function getFoo() {
    // TODO magic goes here to setup defaultErrorCallback as default
    return $http.get("/not_exists");
};

function defaultErrorCallback() { console.log("DDD"); }
function customCallback() { console.log("CCC"); }

getFoo().then(fooSuccess);
// output: DDD

getFoo().then(fooSuccess, customCallback);
// output: CCC

4 个答案:

答案 0 :(得分:1)

我认为没有办法为个人承诺做到这一点,但是override Angular's default error handling有可能从Angular1.6开始只能处理其他地方没有发现的错误:

angular.
  module('exceptionOverwrite', []).
  factory('$exceptionHandler', ['alertService', function(alertService) {
    return function myExceptionHandler(exception, cause) {
      alertService.alertError(exception, cause);
    };
  }]);

如果要添加处理以专门处理来自getFoo()的错误,您可以让getFoo()将一些信息注入错误中以使其可识别:

function getFoo() {
    return $http.get("/not_exists")
        .catch(function (error) {
            error.errorSource = 'getFoo';
            throw error;
        });
}

// elsewhere...
angular.
  module('exceptionOverwrite', []).
  factory('$exceptionHandler', ['alertService', function(alertService) {
    return function myExceptionHandler(exception, cause) {
      if(exception.errorSource = 'getFoo') {
        alertService.alertError(exception, cause);
      } else {
        // default error handling
      }
    };
  }]);

答案 1 :(得分:1)

HTML 5.1中有一些内容 "uncaught promise rejection" mechanism,在承诺被拒绝的情况下,对被拒绝的承诺发送“无法撤销”事件。您添加事件侦听器,获得通知,处理拒绝并取消事件。您还可以监视“拒绝处理”事件以获取其他信息。实际上,您将实现您自己的HostPromiseRejectionTracker,如ES7标准的第25.4.1.9节(pdf的第521页)所述,它可能非常复杂,非常快。

在Promise实现中没有这样的东西,它要求用户代码添加特定处理程序以拒绝承诺,作为.then的第二个参数或.catch的第一个参数(这是语法糖的无论如何then方法)。有很多方法可以实现显式,但如果用户没有提供隐式,则无法提供默认的拒绝处理程序。

已经说过“无捕获”事件并未在浏览器中广泛实施,并且规范可能会在广泛采用之前进行修改。

答案 2 :(得分:0)

试试这个

function getFoo() {
    // TODO your $q magic goes here.
    return $http.get("/foo");
};

var res = getFoo();
res.success(function(result, status) {      
    console.log('succes : getFoo()');

}).
error(function(data, status) {
    console.log('failed calling service: method : getFoo()');
        // here you call your default function
});

答案 3 :(得分:0)

尝试创建这样的包装 -

请记住 承诺是可链式对象

function defaultCallback(){}
function okCallBack(){}
function getFoo(successCallback) {
    // TODO your $q magic goes here.
    var firstPromise = $http.get("/foo");
    var defaulErrorCallback=defaultCallback;
        if (typeof successCallback == 'function') {
          return firstPromise.then(successCallback).catch(defaulErrorCallback);

      }else{
         return firstPromise; 
      }
    };
getFoo(okCallBack);
相关问题