这里建议用 done 方法结束承诺链,以便重新抛出错误:
完成与然后使用的黄金法则是:要么回报你的承诺 给其他人,或者如果链以您结束,请调用 DONE 终止 它。以 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
}
所以基本上 angular 还会在 exceptionHandler(e);
中记录来自 promise 处理程序的错误,这样它就不会被忽视。如果需要,可以覆盖默认exceptionHandler
的行为,如此处所述。
承诺/A+规范的
done()
方法
请注意,Promise 只指定了 then
,它没有说明done
。
Q
建议...在 Angular 中的用法如何?
Q
不是$q
!在 Angular 的承诺实现上没有done
方法,所以我建议不要使用它。
Q
的黄金法则不适用于Angular,它们具有很大的不同功能。
承诺是异步的,因此不能在回调周围使用 try catch
语句。 done
用于向环境抛出不可恢复、无法捕获的内容(因此将调用window.onerror
或process.onuncaughtexception
)。
如果要捕获异常,则应将 catch
方法与回调一起使用:
$q.reject(new Error()).catch(function(e) {
console.log("does catch an error");
});
要捕获未处理的拒绝(在承诺链的末尾),您还可以使用 $exceptionHandler
.
角度使用$q即:
受克里斯·科瓦尔的 Q 启发的承诺/延迟对象的实现。
你需要使用角度文档中提供的 Promise API:.final()、.then() 和 .catch()。
角度很好地描述了这种差异:
Q 具有比 $q 多得多的功能,但这是以字节为代价的。 $q很小,但包含常见异步任务所需的所有重要功能。
所以看起来$q中没有 .done()。
希望它能回答你的问题。
除了sebastienbarbier的回答之外,$q角服务也与$digest循环(角度在内部运行)相关联,并且(对于$q)执行Kris Kowal的Q中的.done()功能。
这可能会在测试中发现,其中 $scope.digest() 确保承诺得到完全解决。