我想做一些简单的事情:我希望我的函数返回一个promise(1)。这个承诺(1)将使用另一个承诺(2)来执行任务。 Promise(2)被链接到多个then / catch步骤。在这些步骤中,承诺(1)可能需要被解决/拒绝。承诺链(2)需要停止执行,因为现在承诺(1)被解决/拒绝并且应该停止运行。
最好的方法是什么?
请参阅以下示例代码:
function performDiv(a, b) {
return new Promise(function (res, rej) { // promise(2)
if (b === 0) {
return rej(new Error('div by 0'));
}
res(a / b);
})
}
function div(a, b) {
return new Promise(function (res, rej) { // promise(1)
performDiv(a, b)
.then(res) // <--- HERE I want to break the chain
.catch(rej) // <--- OR HERE, if there's a problem
.then(function () {
console.log('I don\'t want this to be shown')
});
});
}
div(10, 2)
.then(function (result) {
console.log(result);
})
.catch(function (err) {
console.log(err);
});
目前,I don't want this to be shown
(一个假设的下一步,以解决承诺(1))显示,而我想找到一个解决方案,它不是,因为承诺(1)是已经解决/拒绝。
答案 0 :(得分:0)
我认为这里的问题是对承诺如何运作的误解。
打破承诺链的唯一方法就是抛出一个错误,直到结束才捕获它。
让我们举个例子。
__TokenVariable1__
A&amp; A B可能会抛出一个错误来打破function div(a, b) {
return new Promise(function (res, rej) { // promise(1)
performDiv(a, b)
.then(res) // <--- HERE I want to break the chain (A)
.catch(rej) // <--- OR HERE, if there's a problem (B)
.then(function () { // (C)
console.log('I don\'t want this to be shown')
});
});
}
的链条。
如果(A)抛出错误B将捕获它。在B中你调用拒绝函数,它将Promise 1设置为被拒绝,但是它继续执行Promise 2上的剩余链,因为,rej方法返回一个值(可能是未定义的),这使得该promise(一个catch返回)解决。
带走:每个
then
或then
本身都会返回一个承诺。打破链条会抛出一个错误,直到最后都不会捕获它。