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

2024-03-14

这是我的代码:

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”所以我想这意味着所有履行功能都已清理。但看来我错了

所以我的问题是:

  • 为什么当我调用 cancel() 时,如果承诺被取消,我会在输出中看到“AYYYY”。
  • What's exactly doing cancel in here? what is cancel actually doing in this case?
  • 有没有办法取消承诺内容的执行或承诺的传播?

为什么当我调用 cancel() 时,如果承诺被取消,我会在输出中看到“AYYYY”。

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

With catch(),您正在捕获取消错误,这会产生一个新的承诺,并用该值解决undefined(因为你没有从.catch()处理程序)。

所以你提供的功能then被称为就好了。

在这种情况下cancel实际上做了什么?

来自蓝鸟文档:

取消 Promise 会传播到仍处于待处理状态的目标 Promise 的最远可取消祖先,并以给定原因拒绝该 Promise(默认为取消错误)。

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

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

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

You can如果决议尚未传播到 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

正如你所看到的,原来的承诺被取消了,所以“这从未被调用”部分永远不会被调用。你有catch and then进一步恢复链条的调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

承诺取消仍在触发履行功能 的相关文章