Here建议使用done方法结束promises链,以便重新抛出错误:
完成黄金法则然后使用是:要么回报你的承诺 对于其他人,或者如果链条以你结束,请致电完成终止 它。使用catch终止是不够的,因为catch处理程序 可能会抛出错误。
它是否适用于AngularJs?我看了,框架中似乎没有这样的方法。
更新
我已经查看了代码,发现了以下内容:
try {
if (isFunction(fn)) {
promise.resolve(fn(state.value));
} else if (state.status === 1) {
promise.resolve(state.value);
} else {
promise.reject(state.value);
}
} catch (e) {
promise.reject(e);
exceptionHandler(e);
}
window.onerror = function(e) {
// doesn't come here
}
因此,基本上角度还会在exceptionHandler(e);
中记录来自promise处理程序的错误,因此不会被忽视。如果需要,可以按照here的说明覆盖默认exceptionHandler
的行为。
答案 0 :(得分:1)
Angular使用$ q,即:
受Kris Kowal的Q启发的承诺/延期对象的实现。
您需要使用角度文档中提供的the Promise API:。finally(),. then()和.catch()。
Angular很好地描述了这种差异:
Q具有比$ q更多的功能,但这需要以字节为单位。 $ q很小,但包含常见异步任务所需的所有重要功能。
看起来$ q中没有.done()。
希望它能回答你的问题。
答案 1 :(得分:1)
除了sebastienbarbier的答案之外,$ q角度服务还与$ digest循环(该角度在内部运行)相关联,并且(对于$ q)在Kris Kowal的Q中执行.done()函数。
这可以在测试中找到你,$ scope.digest()确保promises完全解析。
答案 2 :(得分:1)
Promises / A +规范
done()
方法
请注意,Promises仅指定then
,它对done
没有任何说明。
Q
recommends来......在Angular中的使用情况如何?
Q
不是$q
! Angular的promise实现没有done
方法,所以我建议不要使用它。
Q
的黄金法则不适用于Angular,它们的功能大不相同。
Promise是异步的,因此您不能在回调周围使用try catch
语句。 done
用于向环境投放不可恢复的,无法捕获的内容(因此将调用window.onerror
或process.onuncaughtexception
。)
如果要捕获异常,则应使用catch
方法进行回调:
$q.reject(new Error()).catch(function(e) {
console.log("does catch an error");
});
要捕获未处理的拒绝(在您的承诺链的末尾),您也可以使用$exceptionHandler
。