首页 文章

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

提问于
浏览
0

我想做一些简单的事情:我希望我的函数返回一个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

    我认为这里的问题是对承诺如何运作的误解 .

    打破承诺链的唯一方法就是抛出一个错误而不是直到结束才 grab 它 .

    让我们举个例子吧 .

    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都可能抛出错误来打破 then -ables链 .

    如果(A)抛出错误B将捕获它 . 在B中你调用拒绝函数,它将Promise 1设置为被拒绝,但是它继续执行Promise 2上的剩余链,因为,rej方法返回一个值(可能是未定义的),这使得该promise(一个catch返回)解决 .

    带走:每一个或者自己回归一个承诺 . 打破链条抛出一个错误,直到最后才 grab 它 .

相关问题