如何使用.cancel()与蓝鸟

时间:2016-04-16 11:01:23

标签: promise bluebird

此处的文档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');
  });

那么如何使用这种方法?

1 个答案:

答案 0 :(得分:4)

要使用.cancel(),首先您需要将cancellation 设置为,然后才能调用函数.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

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