【问题标题】:Bluebird Promise Cancellation蓝鸟承诺取消
【发布时间】:2015-02-13 06:37:25
【问题描述】:

假设我有以下 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。

【问题讨论】:

  • 我认为您必须首先而不是最后一个取消承诺。
  • Tomalak 是对的,你只是让.catch() 最后返回的承诺可以取消。事后父母不能从孩子那里继承可取消性,但孩子会从父母那里继承可取消性。

标签: javascript promise future bluebird


【解决方案1】:

在您的情况下,您仅在附加 catch 处理程序后才做出承诺 cancellable。但承诺还不是cancellable。所以,cancel 函数调用不会引发Promise.CancellationError

你需要改变代码的结构,像这样

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

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

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

【讨论】:

  • 当我尝试在 .catch() 之前使用 .cancellable() 引入承诺时,服务器永远不会启动......
  • @AbrahamP 确保删除; 之后的.cancellable。如果这不是问题,请显示当前代码。
  • 当前代码:github.com/apolishch/bookshelf-soft-delete/blob/master/index.js 用于错误情况,将第 20 行和第 26 行替换为 return parentPromise.cancel() 并在第 30 行和第 31 行之间添加一行 .cancellable。
  • @AbrahamP 真的很抱歉,如果你能想出一个SSCCE就更好了
  • @AbrahamP 这里是一个有效取消的简单示例:gist.github.com/troygoode/cb82991c71eafa0c7323
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2014-02-13
  • 2014-11-06
  • 2015-09-06
相关资源
最近更新 更多