promise.then回调是微任务,会在当前宏任务结束后立即执行,优先于settimeout等宏任务,如代码输出顺序为1→4→2→3所示。

Promise.then 是标准微任务
Promise.then() 回调被明确归类为微任务(Microtask),这是 JavaScript 规范定义的行为,不是实现差异。只要 Promise 状态变为 fulfilled 或 rejected,对应的 .then() 回调就会被推入当前事件循环的微任务队列,**不依赖浏览器或 Node.js 版本**。
它和宏任务有明确执行时序隔离
微任务总在“一个宏任务执行完后、下一个宏任务开始前”被清空。这意味着:
- 同步代码执行完,立刻执行所有已排队的 .then(),哪怕有多个链式调用
- setTimeout、setInterval、I/O 回调等宏任务,哪怕 delay 设为 0,也必须等微任务队列清空后才轮到
- UI 渲染(如样式更新、重绘)通常发生在微任务清空之后、下一个宏任务之前,所以大量 .then() 连续执行会阻塞页面响应
区分方式:看回调何时入队、何时触发
关键不在写法,而在 Promise 状态变化的时机:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 构造函数内部是同步的:new Promise((resolve) => { console.log('sync'); resolve(); }) 中的 console.log 和 resolve() 都立即执行
- .then() 是异步的:即使 resolve() 立即调用,.then() 回调也不会在当前同步上下文中运行,而是进入微任务队列
- 链式 .then() 逐级入队:每个 .then() 返回新 Promise,其回调在上一个 .then() 执行完毕后(作为微任务)再入队,形成微任务链
验证方法:用经典顺序题确认
运行这段代码,输出顺序就是最直接的判断依据:
console.log(1);
Promise.resolve().then(() => console.log(2));
setTimeout(() => console.log(3), 0);
console.log(4);
结果必为 1 → 4 → 2 → 3。其中 2 的位置就证明了 .then() 属于微任务——它插在同步结束与宏任务之间,且优先于 setTimeout。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










