在另一个承诺链中解决承诺并阻止该链

时间:2017-03-11 13:06:19

标签: javascript node.js es6-promise

我想做一些简单的事情:我希望我的函数返回一个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)是已经解决/拒绝。

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返回)解决。

  

带走:每个thenthen本身都会返回一个承诺。打破链条会抛出一个错误,直到最后都不会捕获它。