异步函数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完成,有两种常用方式:
- 在async函数内部用
await接收
async function runQuiz() { const result = await createQuiz(questions, quizDetails); console.log(result); } runQuiz();
- 用Promise的
.then()链式调用处理
createQuiz(questions, quizDetails) .then(result => console.log(result)) .catch(error => console.log(error));
内容的提问来源于stack exchange,提问作者Bruno Oliveira
相关产品推荐
相关产品推荐

