Javascript 蓝鸟承诺取消

Javascript 蓝鸟承诺取消,javascript,promise,future,bluebird,Javascript,Promise,Future,Bluebird,假设我有以下承诺链: var parentPromise = Promise.resolve() .then(function () { var condition = false; if (condition) { return parentPromise.cancel('valid reason'); } else { return Promise.resolve() .then(function () {

假设我有以下承诺链:

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();
以上内容从未进入
捕获

如果我们将
条件
交换为
,则不会触发内部取消,但仍不会触发
捕获

删除结尾处的
.cancelable
,并将
parentPromise.cancel()
的所有实例替换为显式的
抛出新承诺。CancellationError()
修复了该问题。我不明白的是为什么

为什么最初的方法不起作用

我使用的是bluebird 2.3.11。

创建了可取消的承诺,默认情况下,当调用
cancel
函数时,只有这些承诺才会抛出
CancellationError

在您的情况下,只有在附加了
catch
处理程序之后,您才可以取消承诺。但这一承诺还不能取消。因此,
cancel
函数调用不会引发
Promise.CancellationError

您需要更改代码的结构,如下所示

then(function(..) {
    ...
})
.cancellable()
.catch(Promise.CancellationError, function (err) {
    ...
});
注意:我建议Promission使用其漂亮的
Promise
构造函数。它类似于ECMA脚本6规范

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

我认为你必须首先取消承诺,而不是最后一次。托马拉克是对的,你只是在最后取消
.catch()
返回的承诺。事实发生后,父母不能从他们的子女继承可取消性,但子女将从他们的父母继承可取消性。当我试图在my.catch()之前使用.Cancelable()引入承诺时,服务器从未启动…@AbrahamP请确保删除
之后。可取消
。如果这不是问题,请显示当前代码。当前代码:对于错误情况,请将第20行和第26行替换为return parentPromise.cancel(),并在第30行和第31行之间添加一行,该行仅显示.cancelable。@AbrahamP我真的很抱歉,如果你能想出一个@AbrahamP,那就更好了这里是一个简单的工作取消示例: