提问人:Prashant 提问时间:9/25/2023 更新时间:9/25/2023 访问量:37
在 await 表达式中拒绝 promise 后,代码继续执行
Code continues to execute after promise is reject in await expression
问:
在 chrome 控制台中运行以下代码,您可以看到正在打印的控制台日志。为什么即使在抛出错误后它也会被打印出来?f2()
async function f1() {
const p = await f2();
console.log("This line should not get printed since the promise was rejected");
}
async function f2() {
Promise.reject("promise rejected");
}
f1();
答:
0赞
D V
9/25/2023
#1
你面临的问题是因为你没有正确处理 f2() 返回的 Promise 的拒绝。执行 时,它会创建一个被拒绝的 Promise,但您没有处理该拒绝。Promise.reject("promise rejected")
要解决此问题和类似问题,您应该始终使用方块来消除副作用,在这种情况下,您可以这样做:try-catch
async function f1() {
try {
const p = await f2();
console.log("This line should not get printed since the promise was rejected");
} catch (error) {
console.error(error); // If you want you can ignore logging anything
}
}
async function f2() {
return Promise.reject("promise rejected");
}
f1();
评论
2赞
Jaromanda X
9/25/2023
您不必使用 try/catch 来使代码按预期工作,在某些情况下,如果更高级别的函数(例如调用 f1 的函数)处理拒绝,您可能不会......这个答案唯一相关的部分是return
0赞
D V
9/25/2023
@JaromandaX我确实明白你的意思,但是如果不使用 catch,你还建议如何处理拒绝,你必须在某个地方抓住它?仅使用 将在此处留下未处理的承诺拒绝,因为没有更高的函数。return
1赞
Jaromanda X
9/25/2023
问题不在于如何处理拒绝,而在于为什么代码会继续:p我的评论并不是说你的答案是错误的
0赞
Bergi
9/25/2023
...你也可以使用f1().catch(console.error)
0赞
Jaromanda X
9/25/2023
@Bergi - 正是我在第一条评论中的观点
评论
Error
Promise.reject( Error("promise rejected") )
return
It is considered good practice to only pass instances of the built-in Error object to the reject() function for user-defined errors in Promises.