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

时间:2016-11-25 19:45:40

标签: promise bluebird

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

我希望能够记录资源异常并在那里停止承诺链。如果我让它沉默,那么链条会导致then,如果我再次抛出它就会被视为未处理的拒绝。 通过节点process全局捕获这些不是一个选项,因为平台上的其他库可能依赖于它。

可以拒绝拒绝并仍然阻止履行链继续吗?

1 个答案:

答案 0 :(得分:0)

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

  1. 解决
  2. 拒绝
  3. 从未解决或拒绝。
  4. 一旦解决或拒绝,就没有ECMAScript标准方法告诉它不要调用任何处理程序。

    有些第三方承诺库支持.abort()方法或.cancel()方法。例如,Bluebird 3.x有一个.cancel()方法可以停止链,而不会为该承诺调用.then()个处理程序。

    使用标准promises处理此问题的常用方法是创建一个已知已解决或已拒绝的状态,指示链不应继续,然后您必须让立即链接的.then()处理程序可以检查具体国家。您可以想象,通过添加.cancel()方法并覆盖.cancel().then()来检查取消状态的承诺,然后再调用处理程序,可以为标准承诺添加.catch()功能。< / p>