在Node.js中嵌套promise时承诺解决/拒绝

时间:2019-04-22 14:13:52

标签: javascript node.js promise

如果在承诺中引发的错误(在父承诺中被称为错误),我们应该捕获错误还是将其自动捕获?

示例:

function p1(val)
{
    return new Promise((resolve, reject) => {

        //do something with val
        if(val == true)
           reject(err);

        p2()
        .then(result => resolve(result)
        .catch(reject); //is this line necessary?
    });
}

function p2()
{
    return new Promise((resolve, reject) => {
        //resolve or reject...
    });
}

1 个答案:

答案 0 :(得分:1)

使用修改后的代码,您可以在调用p2之前进行工作,因此有一些选择。如果您对functino的初始,同步部分中的错误感到满意,而不是拒绝承诺,则可以这样做:

function p1(val) {
    //do something with val
    if (val == true)
        throw err;

    return p2();
}

第一部分同步发生,然后从p2返回promise。是否执行此操作部分取决于函数的功能,而部分取决于样式。如果初始同步部分正在设置异步操作,并且您希望在设置异步过程遇到问题时抛出该函数(而不是返回被拒绝的诺言)(然后根据异步过程是否起作用来实现/拒绝) ),您可以这样做。

如果您希望函数始终通过承诺报告成功/失败,那么,如果您在进行初始工作,则确实需要自己的承诺:

function p1(val) {
    return new Promise((resolve, reject) => {
        //do something with val
        if(val == true)
           reject(err);

        resolve(p2());
    });
}

resolve(p2())部分将创建的承诺p1解析为p2的承诺:如果p2的承诺被拒绝,则p1的承诺被拒绝。 p2拒绝原因;如果p2的诺言得以兑现,则p1的诺言将以p2兑现价值来实现。

或者您可以使用async函数,其结果相同:

async function p1(val) {
    //do something with val
    if(val == true)
        throw err;

    return p2();
}

在两种情况下,即使初始代码不涉及异步处理,也可以确保初始代码在p2之前抛出的任何错误均导致拒绝而不是同步错误。

要记住的主要事情是,当您已经有了一个承诺(例如来自p2的承诺)时,就无需使用new Promise;相反,只是束缚您已经拥有的诺言。 ({More here。)但是,当您在之前做某事时,您会得到应有的承诺,就像在修改后的示例中一样,您可能会根据是否想要函数的第一部分来创建自己的承诺。同步错误或承诺拒绝。