【问题标题】:Promise resolve/reject in case of nested promise in Node.js在 Node.js 中嵌套承诺的情况下承诺解决/拒绝
【发布时间】:2019-04-23 17:32:52
【问题描述】:

如果在父 Promise 中调用的 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...
    });
}

【问题讨论】:

  • 如果 p2 返回一个 Promise,那么新的 Promise 有什么意义呢?您应该很少使用它。
  • 如果你真的返回了 p2,而你现在没有这样做,那么可以在更高的级别上进行捕获。例如。通过将捕获附加到 p1
  • 随便function p1() { return p2(); } ?
  • 我不认为这是 相当 the construction antipattern question 的复制品。它肯定很接近,但如果您出于某种原因正在使用new Promise,不,reject 不是自动的。
  • 谢谢@T.J.Crowder 我会尽快更新我的问题

标签: javascript node.js promise


【解决方案1】:

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

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

    return p2();
}

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

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

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

        resolve(p2());
    });
}

resolve(p2()) 部分解析从p2 创建的promise p1:如果p2 的promise 被拒绝,p1 的promise 会以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.) 但是当你在 before 做某事时,你会得到承诺,就像在你修改后的例子中一样,你可以根据你是否希望函数的第一部分错误来创建你自己的同步或承诺拒绝。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2017-02-05
    • 2017-04-20
    • 2021-03-14
    • 2013-06-22
    • 1970-01-01
    • 2017-04-04
    相关资源
    最近更新 更多