这是我的代码:
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(使用前将#替换为@)