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

Promise含回调时的执行顺序疑问:JavaScript代码输出困惑

为什么你的Promise代码输出顺序和预期不一样?

先拆解代码的执行逻辑,帮你理清顺序问题:

  1. 同步任务优先执行
    JavaScript是单线程语言,所有同步代码会按顺序先执行完毕:
  • 创建Promise实例时,构造函数内部的代码会同步运行:
    • 将setTimeout的回调(10秒后输出"promise executed")放入宏任务队列等待执行
    • 立刻调用res("async executed"),把Promise的状态改为resolved,同时将.then里的回调放入微任务队列等待
  • 接着执行console.log("sync programming in progress"),输出对应内容
  • 随后注册Promise的.then和.catch(回调不会立刻执行,只是进入队列)
  • 最后执行console.log("sync program done"),输出对应内容
  1. 同步任务结束后,先处理微任务队列
    同步代码跑完后,JavaScript引擎会优先清空所有微任务:
  • 取出.then的回调执行,输出res的值"async executed"
  1. 微任务清空后,再处理宏任务队列
    等微任务队列空了,才会轮到处理宏任务队列里的任务:
  • 10秒后,setTimeout的回调执行,输出"promise executed"

为什么"async executed"没延迟10秒?

因为res("async executed")是同步调用的,根本没等setTimeout。你把res写在setTimeout外面,Promise的状态会立刻变成resolved,.then的回调自然会在同步任务结束后马上执行,和10秒延迟完全无关。如果想让"async executed"在10秒后输出,需要把res移到setTimeout的回调里:

let promise = new Promise((res, rej) => {
  setTimeout(() => {
    console.log("promise executed");
    res("async executed"); // 把res移到这里
  }, 10000);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:40:38