为何该JavaScript异步函数未输出'done'?
为什么两个async函数的执行结果不同?
核心原因是第一个代码中的Promise从未被决议(resolve/reject),导致await一直处于等待状态,后续代码无法执行。
带await的代码分析
async function fn() { await new Promise(() => { console.log("promise"); }); console.log("done"); } fn();
- 创建
Promise时,传入的执行器函数会立即执行,所以先打印出promise。 - 但这个执行器里没有调用
resolve()或reject()方法,意味着这个Promise永远不会进入"已完成"或"已失败"状态。 await的作用是暂停当前async函数的执行,直到等待的Promise完成决议。因为Promise一直没被决议,await会一直挂起函数,后面的console.log("done")永远没有机会执行。- 最终输出只有
promise。
不带await的代码分析
async function fn() { new Promise(() => { console.log("promise"); }); console.log("done"); } fn();
- 同样,Promise的执行器会立即执行,打印
promise。 - 但这里没有用
await等待这个Promise,所以async函数不会暂停,会继续执行后续代码,马上打印done。 - 最终输出是
promise和done。
修正写法(让带await的代码输出符合预期)
只要给Promise加上决议调用即可:
async function fn() { await new Promise((resolve) => { console.log("promise"); resolve(); // 调用resolve,标记Promise已完成 }); console.log("done"); } fn();
此时输出就是:
promise done
内容的提问来源于stack exchange,提问作者Sohaib
相关产品推荐
相关产品推荐

