代码之家  ›  专栏  ›  技术社区  ›  Dave

Node.js中嵌套Promise时拒绝Promise[重复]

  •  0
  • Dave  · 技术社区  · 7 年前

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

    例子:

    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 回复  |  直到 7 年前
        1
  •  2
  •   T.J. Crowder    7 年前

    用你修改过的代码,在打电话之前你在哪里工作 p2 ,你有几个选择。如果您对函数的初始同步部分中的错误感到高兴,认为它是同步错误,而不是承诺拒绝,您可以这样做:

    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页 实现价值。

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

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

    在这两种情况下,这确保了在 p2页

    最重要的是,当你已经有了一个承诺(比如 p2页 new Promise 相反,把你已经许下的诺言拴起来。( More here )但是当你做某事的时候 之前 你得到了承诺,就像在你修改过的例子中一样,你可以创建自己的承诺,这取决于你是否希望函数错误的第一部分是同步的还是承诺拒绝的。