如何将 .cancel() 与 bluebird 一起使用

鄢继雄*_*鄢继雄 0 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');
  });
Run Code Online (Sandbox Code Playgroud)

那么如何使用这个方法呢?

Mar*_* K. 5

使用时.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');
Run Code Online (Sandbox Code Playgroud)

如果您使用 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();
Run Code Online (Sandbox Code Playgroud)

另外我建议您看看这篇文章:取消延迟的蓝鸟承诺

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