我正在创建一个返回promise的资源加载器函数 . 该函数执行错误记录:
function load(url) {
return request(..)
.catch(function(error) {
log(error);
throw error;
});
}
该功能用于各种链:
load(a).then(function(res1) {
load(b).then(function(res2) {
// res1 + res2
});
});
我希望能够记录资源异常并在那里停止promise链 . 如果我让它保持沉默,链条将导致 then
,如果我再次抛出,它将被视为未处理的拒绝 . 通过节点的 process
全局捕获这些不是一个选项,因为平台上的其他库可能依赖于它 .
可以拒绝拒绝并仍然阻止履行链继续吗?
1 回答
标准的ES6承诺只有三个结果:
已解决
拒绝了
从未解决或拒绝 .
一旦解决或拒绝,就没有ECMAScript标准方法告诉它不要调用它的任何处理程序 .
有一些第三方承诺库支持
.abort()
方法或.cancel()
方法 . 例如,Bluebird 3.x有一个.cancel()
方法,它将停止链并且不会为该承诺调用.then()
处理程序中的任何一个 .使用标准promise处理此问题的常用方法是创建一个已知已解决或已拒绝的状态,指示链不应继续,然后您必须让立即链接的
.then()
处理程序可以检查该特定状态 . 您可以想象通过添加.cancel()
方法并覆盖.then()
和.catch()
以在调用处理程序之前检查取消状态的承诺,将.cancel()
功能添加到标准承诺 .