关于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
相关产品推荐
相关产品推荐

