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

为何我的示例中Async/Await无法正常生效?

为什么await setTimeout无法让代码按1→2→3的顺序执行?

嘿,这个问题其实挺多刚上手async/await的开发者都会碰到,我来给你拆解一下问题出在哪~

核心问题:setTimeout不返回Promise

你之所以没得到预期的123输出,是因为**await只能等待Promise对象的状态变更**,但原生的setTimeout返回的是一个定时器的ID(一个数字),并不是Promise。所以你写的await setTimeout(...)其实相当于直接跳过等待,代码会继续执行后面的console.log(3),等定时器回调触发时才会输出2,结果自然还是132。

正确的写法:把setTimeout包装成Promise

要让await能正确等待setTimeout的回调执行,你需要把setTimeout包装成一个返回Promise的函数,这样await才能识别并等待它完成。

修改后的代码如下:

(async () => {
  console.log(`1`);
  // 把setTimeout包装成Promise
  await new Promise(resolve => {
    setTimeout(() => {
      console.log(`2`);
      resolve(); // 回调执行完后resolve,告诉await可以继续了
    }, 0);
  });
  console.log(`3`);
})();

这段代码运行后,控制台就会按顺序输出1→2→3了。

补充说明

async/await是Promise的语法糖,它的核心就是基于Promise工作的。任何你想通过await等待的异步操作,都必须是一个Promise(或者能被转换成Promise的对象)。像setTimeout、setInterval这类传统的异步API,都需要手动包装成Promise才能和async/await配合使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:33:21