gpt4 book ai didi

javascript - 在 Node.js 中嵌套 promise 的情况下 promise 解决/拒绝

转载 作者:行者123 更新时间:2023-11-30 19:37:22 25 4
gpt4 key购买 nike

如果在父 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 之前您正在做的工作,你有几个选择。如果您对 functino 的初始同步部分中的错误是同步错误而不是 promise 拒绝感到高兴,您可以这样做:

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

return p2();
}

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

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

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

resolve(p2());
});
}

resolve(p2())部分解决 promise p1根据 p2 的 promise 创建:如果p2的 promise 拒绝,p1的 promise 以 p2 拒绝拒绝原因;如果p2 promise 兑现,p1的 promise 实现了 p2履行值(value)。

或者您可以使用 async函数,它具有相同的结果:

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

return p2();
}

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

要记住的主要事情是,当你已经有了一个 promise (比如来自 p2 的 promise )时,就没有必要使用 new Promise 了。 ;相反,只需将您已经拥有的 promise 联系起来。 ( More here 。)但是当你在 之前做某事时,你会得到 promise ,就像在你修改过的例子中一样,你可以创建你自己的,这取决于你是否希望你的函数的第一部分错误同步或 promise 拒绝。

关于javascript - 在 Node.js 中嵌套 promise 的情况下 promise 解决/拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55795796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com