微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-蓝鸟承诺取消

假设我有以下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();

以上内容永远不会进入陷阱.

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

最后删除.cancellable,并用显式抛出new Promise.CancellationError()替换parentPromise.cancel()的所有实例来“解决”该问题.我不明白为什么?

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

我正在使用bluebird 2.3.11.

解决方法:

cancellable()创建可取消的Promise,并且在无缘无故地调用cancel函数时,默认情况下只有它们会抛出CancellationError.

就您而言,仅在附加了catch处理程序后,您才能取消承诺.但是诺言还不能取消.因此,取消函数调用不会引发Promise.CancellationError.

您需要像这样更改代码的结构

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐