承诺取消仍然解雇履行功能

时间:2015-02-12 20:28:20

标签: javascript promise bluebird cancellation

这是我的代码:

var promiseResult =  new BBpromise(function(resolve, reject){
    console.log(1)
    // some actions
    setTimeout(function(){
        resolve();
    }, 2000);
}).cancellable().catch(BBpromise.CancellationError, function(e){
    console.log(e);
});

promiseResult.then(function(){
    console.log('AYYYY');
});
promiseResult.cancel(new BBpromise.CancellationError()).then(function(s){
    console.log('canceled ?');
});

我得到以下输出:

BTW ..输出似乎是立竿见影的。似乎只是跳了解决。

1
{ [CancellationError: cancellation error] __stackCleaned__: true }
AYYYY
cancelled ?

它说..“stactCleaned:true”所以我猜这意味着所有履行功能都被清理了。但似乎我错了

所以我的问题:

  • 为什么当我打电话取消()时,在我的输出中,如果承诺被取消,我会看到'AYYYY'。
  • 这里取消了什么取消?在这种情况下取​​消实际上是做什么的?
  • 有没有办法取消承诺内容的执行或承诺的传播?

1 个答案:

答案 0 :(得分:1)

  

为什么当我打电话取消()时,在我的输出中,我看到了' AYYYY'如果承诺被取消了。

这是.catch()的通常行为。

使用catch(),您正在捕获取消错误,这会生成一个新的承诺,该承诺已使用值undefined解决(因为您没有从.catch()返回任何内容处理程序)。

所以你提供给then的功能就好了。

  

在这种情况下取​​消实际上是什么?

来自Bluebird文档:

  

取消一个promise会传播到仍然未决的目标promise的最远可取消祖先,并拒绝具有给定原因的promise,或默认为CancellationError。

它正沿着承诺链前进并拒绝您创建的第一个承诺(以及您标记为.cancellable()的承诺)。 .cancel()最多拒绝一个承诺,而不是整个链。

  

有没有办法取消承诺内容的执行或承诺的传播?

您无法取消已经运行的代码的执行,这是您传递给Promise构造函数的函数中的代码的情况。

如果分辨率尚未传播到

可以取消承诺链中下游处理程序的执行。

您可以取消承诺的传播。你正是这样做的。但如果您catch取消,然后将任何内容链接到catch,那么您将重新开始承诺链。

也许这会有点启发:



var promiseResult =  new Promise(function(resolve, reject){
    console.log(1)
    setTimeout(function(){
        resolve("1");
    }, 2000);
}).cancellable().then(function () {
    console.log("this is never called");
    return 2;
}).catch(Promise.CancellationError, function(e){
    console.log(e);
    return 3;
});

promiseResult.then(function(d){
    console.log("got the value " + d);
    return 4;
});
promiseResult.cancel(new Promise.CancellationError()).then(function(s){
    console.log("and I got the value " + s);
    return 5;
});




输出结果为:

1
CancellationError: ...
got the value 3
and I got the value 3

正如您所看到的,原始承诺被取消,因此"这永远不会被调用"部分永远不会被称为。您有catchthen次呼叫可以进一步恢复链接。

相关问题