繁体   English   中英

在 Node.js 中嵌套承诺的情况下承诺解决/拒绝

[英]Promise resolve/reject in case of nested promise in Node.js

如果在父承诺中调用的承诺引发错误,我们应该捕获错误还是会自动捕获错误?

例子:

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...
    });
}

使用修改后的代码,您在调用p2之前所做的工作,您有几个选择。 如果您对 functino 的初始同步部分中的错误是同步错误而不是承诺拒绝感到高兴,您可以这样做:

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

    return p2();
}

第一部分是同步发生的,然后从p2返回承诺。 你是否这样做部分取决于函数正在做什么,部分取决于样式。 如果初始同步部分正在设置异步操作,并且您希望函数在设置异步进程出现问题时抛出(而不是返回被拒绝的承诺)(然后根据异步进程是否工作完成/拒绝) ),你可以这样做。

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

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 相反,只需将您已有的承诺联系起来即可。 更多信息在这里。)但是当你在得到承诺之前做一些事情时,就像在你修改后的例子中一样,你可以根据你是希望函数错误的第一部分是同步的还是承诺拒绝来创建自己的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM