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

JavaScript中async/await下Promise为何提前启动setTimeout计时?

问题解析:async/await中Promise的执行时机

核心点:Promise在被创建的那一刻就已经开始执行了,不是等到await的时候才启动。

咱们一步步拆解你的代码执行流程:

  1. 代码一开始就创建了p1,此时它内部的setTimeout立刻开始计时5秒;
  2. 紧接着创建p2,它内部的setTimeout也立刻开始计时10秒——这俩计时器是同时跑的;
  3. 调用test()函数,遇到await p1,此时test函数会暂停执行,等待p1的状态变为resolved;
  4. 5秒后p1 resolve,test函数恢复执行,先打印res1,再打印hello world;
  5. 这时候p2已经跑了5秒了,还剩5秒就会resolve,所以await p2只需要再等5秒,就能拿到结果并打印。

针对你的两个疑惑:

  • 为什么p2不是p1完成后才计时?因为p2的Promise在代码最开始就已经初始化了,计时器早就启动,await只是等待它完成,不是触发它开始执行。如果想让p2在p1完成后才启动,得把p2的创建放到await p1之后:

    async function test() {
      const res1 = await new Promise((resolve) => setTimeout(() => resolve('p1 fulfilled'), 5000));
      console.log(res1);
      console.log('hello world');
      const res2 = await new Promise((resolve) => setTimeout(() => resolve('p2 fulfilled'), 10000));
      console.log(res2);
    }
    test();
    

    这样p2的计时器会在p1完成后才启动,await p2就需要等10秒。

  • 为什么hello world没有提前打印?因为await p1会暂停test函数的整个执行流程,必须等p1 resolve后,才会继续执行后面的代码。p2的并行执行是在test函数外部的事件循环里,不影响test函数内部代码的串行执行顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:57:45