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

关于JavaScript async/await与Promise的理解误区及代码问题求助

问题分析与解答

你的部分理解是正确的:

  • await 确实会等待 Promise 完成,并返回其 resolve 回调传入的值
  • 包含 await 的函数必须标记为 async

但你漏掉了 async 函数一个核心特性:不管你在 async 函数里返回什么值,它都会被 JavaScript 自动包装成一个 Promise 对象——哪怕你返回的是原始值(比如字符串、数字)、普通对象,甚至是另一个 Promise,最终都会变成 Promise.resolve(返回值) 的形式。

针对你的代码解释

你的代码里:

async function mySynchroniser(promise) { return await promise; }
const stuff = mySynchroniser(new Promise(function (resolve) { resolve('stuff'); }));
console.log(stuff);
  • await promise 确实拿到了 'stuff' 这个字符串,但当你用 return 把它返回时,async 函数立刻把它包装成了 Promise.resolve('stuff')
  • 所以 stuff 变量存储的是这个 Promise 对象,而不是直接的字符串值——这就是你看到 Promise {<pending>} 的原因(即使它最终会 resolve 为 stuff,它本身始终是 Promise 类型)

如何拿到实际值?

要获取 Promise 内部的 'stuff',你有两种常用方式:

方式1:在另一个 async 函数里使用 await

async function mySynchroniser(promise) { return await promise; }

async function logStuff() {
  const stuff = await mySynchroniser(new Promise(resolve => resolve('stuff')));
  console.log(stuff); // 输出 'stuff'
}
logStuff();

方式2:使用 Promise 的 .then() 方法

async function mySynchroniser(promise) { return await promise; }

mySynchroniser(new Promise(resolve => resolve('stuff')))
  .then(stuff => {
    console.log(stuff); // 输出 'stuff'
  });

总结关键点

  • await 负责解包 Promise,拿到内部的实际值
  • async 函数负责重新打包所有返回值为 Promise
  • 因此,调用 async 函数的结果永远是一个 Promise,必须通过 await 或者 .then() 才能获取其中的实际内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:13:15