我有一些代码处理可能会抛出错误的promises。我试图用一个很小的例子来说明问题。
在函数g1
和g2
中,我们调用函数f
,它不会抛出错误但可以设置对象err
并出现错误:
let err;
function f() {
err = new Error('error');
return $q.when('ok');
}
// First implementation
function g1() {
return f().then(res => {
if (err) {
throw err;
} else {
return res;
}
});
}
// Second implementation
function g2() {
const deferred = $q.defer();
f().then(res => {
if (err) {
deferred.reject(err);
} else {
deferred.resolve(res);
}
});
return deferred.promise;
}
g2().then(res => console.log(res))
.catch(err => console.error(err));
我认为这两种实现方式会得到完全相同的结果,但存在差异。我还有一个异常处理程序来捕获我的应用程序中所有未捕获的错误:
angular.module('myModule').factory('$exceptionHandler', function () {
return function (exception, cause) {
console.error(exception);
};
});
调用g2
时,由于捕获了错误,因此不会调用异常处理程序。但是调用g1
就是这种情况:我从异常处理程序获取第一个日志,然后是catch
函数的第二个日志。
有人会对这种行为差异有所了解吗?我认为g1
中使用的语法更容易编写和阅读,但我也不会将我的错误抛出两次......