如何消除承诺拒绝并停止履行链?

Howto silence promise rejections and stop the fulfilment chain?

我正在创建一个 returns 承诺的资源加载器函数。该函数记录错误:

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 全局捕获那些不是一个选项,因为平台上的其他库可能依赖于它。

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

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

  1. 已解决
  2. 已拒绝
  3. 从未解决或拒绝。

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

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

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