【问题标题】:how to use .cancel() with bluebird如何将 .cancel() 与蓝鸟一起使用
【发布时间】:2022-03-01 08:09:58
【问题描述】:

在此处记录 API http://bluebirdjs.com/docs/api/cancellation.html

我在我的演示中尝试过,但不起作用

var Promise = require('bluebird');
var a = require('./a');
var b = require('./b');

var cancelPromise = Promise.resolve();
cancelPromise.cancel();
cancelPromise = a.fnA()
  .then(function() {
    return b.fnB();
  })
  .then(function() {
    console.log('done');
  })
  .finally(function() {
    if (cancelPromise.isCancelled()) {
      console.log('canceled');
    }
    console.log('end');
  });

那么这个方法怎么用呢?

【问题讨论】:

  • 您预计会发生什么?您正在将 cancelPromise 设置为一个虚拟承诺......然后您将取消该虚拟承诺,然后将 cancelPromise 设置为其他内容。
  • 取消功能默认关闭,您可以使用Promise.config启用它。
  • 但是这个来自API示例的代码,我添加了Promise.config,但它不起作用。

标签: promise bluebird


【解决方案1】:

要使用.cancel(),首先需要打开cancellationON,然后才能调用函数.cancel()

如果您使用低于 3 的 bluebird,您的代码应该如下所示:

var mainAction = a.fnA()
.cancellable() // => cancellation turned on
.then(function() {
    return b.fnB();
})
.then(function() {
    console.log('done');
})
.catch(function( err ){  // => 'Reason for cancel'
   console.error(err); 
})
.finally(function() {  
    console.log('end');
});

mainAction.cancel('Reason for cancel');

如果您使用 bluebird 3 及更高版本,代码应如下所示:

var successfulFetch = false, mainAction = a.fnA()
.then(function() {
   return b.fnB();
})
.then(function() {
   console.log('done');
}).finally(function() {
  if(!successfulFetch){
    console.error('Reason for cancel');
  }
  console.log('end');
});
mainAction.cancel();

另外我建议你看看这个帖子:Cancel a delayed Bluebird promise

当我遇到类似问题时,这对我真的很有帮助

【讨论】:

  • 这意味着我无法在任何我想要的步骤中取消它?
  • 您可以在任何步骤中执行此操作。你需要添加:mainAction.cancel()你想取消承诺的地方
猜你喜欢
  • 2016-02-05
  • 2019-12-11
  • 2017-06-09
  • 2016-01-14
  • 2016-08-25
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多