Javascript 蓝鸟承诺取消
假设我有以下承诺链:Javascript 蓝鸟承诺取消,javascript,promise,future,bluebird,Javascript,Promise,Future,Bluebird,假设我有以下承诺链: var parentPromise = Promise.resolve() .then(function () { var condition = false; if (condition) { return parentPromise.cancel('valid reason'); } else { return Promise.resolve() .then(function () {
var parentPromise = Promise.resolve()
.then(function () {
var condition = false;
if (condition) {
return parentPromise.cancel('valid reason');
} else {
return Promise.resolve()
.then(function () {
var someOtherCondition = true;
if (someOtherCondition) {
console.log('inner cancellation');
return parentPromise.cancel('invalid reason');
}
});
}
})
.catch(Promise.CancellationError, function (err) {
console.log('throwing');
if (err.message !== 'valid reason') {
throw err;
}
})
.cancellable();
以上内容从未进入捕获
如果我们将条件
交换为真
,则不会触发内部取消,但仍不会触发捕获
删除结尾处的.cancelable
,并将parentPromise.cancel()
的所有实例替换为显式的抛出新承诺。CancellationError()
修复了该问题。我不明白的是为什么
为什么最初的方法不起作用
我使用的是bluebird 2.3.11。创建了可取消的承诺,默认情况下,当调用cancel
函数时,只有这些承诺才会抛出CancellationError
在您的情况下,只有在附加了catch
处理程序之后,您才可以取消承诺。但这一承诺还不能取消。因此,cancel
函数调用不会引发Promise.CancellationError
您需要更改代码的结构,如下所示
then(function(..) {
...
})
.cancellable()
.catch(Promise.CancellationError, function (err) {
...
});
注意:我建议Promission使用其漂亮的Promise
构造函数。它类似于ECMA脚本6规范
new Promise(function(resolve, reject) {
...
});
我认为你必须首先取消承诺,而不是最后一次。托马拉克是对的,你只是在最后取消
.catch()
返回的承诺。事实发生后,父母不能从他们的子女继承可取消性,但子女将从他们的父母继承可取消性。当我试图在my.catch()之前使用.Cancelable()引入承诺时,服务器从未启动…@AbrahamP请确保删除代码>在之后。可取消
。如果这不是问题,请显示当前代码。当前代码:对于错误情况,请将第20行和第26行替换为return parentPromise.cancel(),并在第30行和第31行之间添加一行,该行仅显示.cancelable。@AbrahamP我真的很抱歉,如果你能想出一个@AbrahamP,那就更好了这里是一个简单的工作取消示例: