在 await 表达式中拒绝 promise 后,代码继续执行

Code continues to execute after promise is reject in await expression

提问人:Prashant 提问时间:9/25/2023 更新时间:9/25/2023 访问量:37

问:

在 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();
JavaScript 承诺 es6-promise

评论

0赞 NoNam4 9/25/2023
您应该用 .试试这个:ErrorPromise.reject( Error("promise rejected") )
2赞 Jaromanda X 9/25/2023
尝试拒绝 - 否则调用函数不知道发生了什么return
0赞 Jaromanda X 9/25/2023
@NoNam4这不是拒绝的工作方式,即它不必是错误类型
0赞 NoNam4 9/25/2023
@JaromandaX根据 eslint 拒绝应该是 Error 类型: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.
0赞 Jaromanda X 9/25/2023
@NoNam4 eslint 是错误的 - 再次 - 哦,“好做法”......这很好,上完厕所后洗手也是个好习惯,但这不是规则

答:

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 - 正是我在第一条评论中的观点