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

Typescript中setTimeout结合async/await执行顺序异常问题求解

输出顺序异常原因
  • async修饰的函数如果没有显式返回自定义Promise,默认会直接返回状态为fulfilled的空Promise。你写的delay2里只是调用了setTimeout就直接结束了,不会等待定时器回调执行,await delay2(2000)不会产生实际的等待效果,调用完立刻就向下执行后续代码。
  • setTimeout属于宏任务,会被推入事件队列等待同步代码、微任务全部执行完成后才会触发回调。所以会先执行3 - after、4 - done,等2秒计时结束后才会打印2 - timeout。
修复方案

修改delay2函数,返回一个在定时器回调中触发resolve的Promise,就能让await正确等待计时结束再向下执行:

const delay2 = (ms: number) => new Promise<void>((resolve) => {
  setTimeout(() => {
    console.log('2 - timeout')
    resolve()
  }, ms)
})

const mainAsync2 = async () => {
  console.log('1 - before');
  await delay2(2000);
  console.log('3 - after');
}
mainAsync2()
.then(res => console.log('4 - done'));

修改后输出顺序就会符合预期:

1 - before
2 - timeout
3 - after
4 - done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:27:03