有没有办法为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
答案 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);