蓝鸟承诺取消

时间:2014-12-15 07:44:10

标签: javascript promise future bluebird

说我有以下Promise链:

var parentPromise = Promise.resolve()
  .then(function () {
    var condition = false;
    if (condition) {
      return parentPromise.cancel('valid reason');
    } else {
      return Promise.resolve()
        .then(function () {
          var someOtherCondition = true;
          if (someOtherCondition) {
            console.log('inner cancellation');
            return parentPromise.cancel('invalid reason');
          }
        });
    }
  })
  .catch(Promise.CancellationError, function (err) {
    console.log('throwing');
    if (err.message !== 'valid reason') {
      throw err;
    }
  })
  .cancellable();

以上内容永远不会进入catch

如果我们将condition交换为true,则内部取消永远不会被击中,但catch仍未被触发。

删除最后的.cancellable,并将parentPromise.cancel()的所有实例替换为显式throw new Promise.CancellationError()“修复”问题。我不明白的是为什么?

为什么原始方法不起作用?

我正在使用蓝鸟2.3.11。

1 个答案:

答案 0 :(得分:3)

cancellable()创建可取消的承诺,只有在默认情况下调用CancellationError函数时才会抛出cancel

在您的情况下,您只有在附加cancellable处理程序后才会发出承诺catch。但承诺不是cancellable。因此,cancel函数调用不会引发Promise.CancellationError

您需要更改代码的结构,例如

then(function(..) {
    ...
})
.cancellable()
.catch(Promise.CancellationError, function (err) {
    ...
});

注意:我建议使用其漂亮的Promise构造函数来承诺。它类似于ECMA Script 6规范。

new Promise(function(resolve, reject) {
    ...
});