承诺取消仍在触发履行功能

promise cancellation still firing fulfill function

这是我的代码:

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 ?');
});

我得到以下输出:

顺便说一句..输出似乎是即时的。好像只是跳那个决心。

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

它说.. "stactCleaned: true" 所以我想这意味着所有的 fulfill 函数都被清除了。但我好像错了

所以我的问题:

why when I call to cancel(), in my output I see 'AYYYY' if the promise was cancelled.

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

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

所以你提供给then的函数被调用得很好。

What is cancel actually doing in this case?

来自 Bluebird 文档:

Cancelling a promise propagates to the farthest cancellable ancestor of the target promise that is still pending, and rejects that promise with the given reason, or CancellationError by default.

它沿着 promise 链向上移动并拒绝您创建的第一个 promise(您标记为 .cancellable())。 .cancel() 最多拒绝一个承诺,而不是整个链。

Is there a way to cancel the execution of the content of a promise or the propagation of the promise?

您无法取消已经 运行 的代码的执行,您传递给 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

如您所见,原来的 promise 被取消了,所以 "this is never called" 部分永远不会被调用。您有 catchthen 调用可以进一步向下恢复链。