说我有以下Promise链:
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();
以上内容永远不会进入catch
。
如果我们将condition
交换为true
,则内部取消永远不会被击中,但catch
仍未被触发。
删除最后的.cancellable
,并将parentPromise.cancel()
的所有实例替换为显式throw new Promise.CancellationError()
“修复”问题。我不明白的是为什么?
为什么原始方法不起作用?
我正在使用蓝鸟2.3.11。
答案 0 :(得分:3)
cancellable()
创建可取消的承诺,只有在默认情况下调用CancellationError
函数时才会抛出cancel
。
在您的情况下,您只有在附加cancellable
处理程序后才会发出承诺catch
。但承诺不是cancellable
。因此,cancel
函数调用不会引发Promise.CancellationError
。
您需要更改代码的结构,例如
then(function(..) {
...
})
.cancellable()
.catch(Promise.CancellationError, function (err) {
...
});
注意:我建议使用其漂亮的Promise
构造函数来承诺。它类似于ECMA Script 6规范。
new Promise(function(resolve, reject) {
...
});