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

为何该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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:45:00