这是我的代码:
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”所以我猜这意味着所有履行功能都被清理了。但似乎我错了
所以我的问题:
答案 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
正如您所看到的,原始承诺被取消,因此"这永远不会被调用"部分永远不会被称为。您有catch
和then
次呼叫可以进一步恢复链接。