You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

异步函数try/catch中return语句使用问题:为何返回Promise pending?

为什么async函数返回值直接console.log会显示Promise { pending }?

先看两段代码的差异:

原正常运行的代码

async function createQuiz(questions, quizDetails) {
  const { quizName, minPoints, maxPoints } = quizDetails;
  try {
    const quiz = await Quiz.create({
      quizName,
      minPoints,
      maxPoints,
      questions,
    })
    if (quiz) console.log("success");
  } catch (e) {
    console.log(e.message);
  }
}

createQuiz(questions, quizDetails);

修改后输出异常的代码

async function createQuiz(questions, quizDetails) {
  const { quizName, minPoints, maxPoints } = quizDetails;
  try {
    const quiz = await Quiz.create({
      quizName,
      minPoints,
      maxPoints,
      questions,
    })
    if (quiz) return "success";
  } catch (e) {
    return e.message;
  }
}

console.log(createQuiz(questions, quizDetails));

核心原因

所有async函数的返回值都会被自动包装成Promise对象,不管你return的是普通字符串还是错误信息。

  • 第一段代码里,console.log("success")是在await Quiz.create()完成后执行的——await会阻塞当前函数,等待异步操作结束,所以内部的console.log是在Promise状态变为resolved后才触发,能正常输出结果。而你调用createQuiz()时,虽然函数返回了Promise,但你没处理它,不过内部的输出已经在异步完成后执行了,所以能看到预期内容。

  • 第二段代码里,你把内部输出换成了return,此时createQuiz()返回的是一个Promise对象。当你直接console.log(createQuiz(...))时,异步操作Quiz.create()还没完成,Promise处于pending状态,所以控制台直接打印出这个未完成的Promise。

解决办法

要获取async函数的返回值,必须等待Promise完成,有两种常用方式:

  1. 在async函数内部用await接收
async function runQuiz() {
  const result = await createQuiz(questions, quizDetails);
  console.log(result);
}
runQuiz();
  1. 用Promise的.then()链式调用处理
createQuiz(questions, quizDetails)
  .then(result => console.log(result))
  .catch(error => console.log(error));

内容的提问来源于stack exchange,提问作者Bruno Oliveira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:08:20