首页 文章

如何沉默承诺拒绝并停止履行链?

提问于
浏览
0

我正在创建一个返回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 回答

  • 0

    标准的ES6承诺只有三个结果:

    • 已解决

    • 拒绝了

    • 从未解决或拒绝 .

    一旦解决或拒绝,就没有ECMAScript标准方法告诉它不要调用它的任何处理程序 .

    有一些第三方承诺库支持 .abort() 方法或 .cancel() 方法 . 例如,Bluebird 3.x有一个 .cancel() 方法,它将停止链并且不会为该承诺调用 .then() 处理程序中的任何一个 .

    使用标准promise处理此问题的常用方法是创建一个已知已解决或已拒绝的状态,指示链不应继续,然后您必须让立即链接的 .then() 处理程序可以检查该特定状态 . 您可以想象通过添加 .cancel() 方法并覆盖 .then().catch() 以在调用处理程序之前检查取消状态的承诺,将 .cancel() 功能添加到标准承诺 .

相关问题