Promise异步执行顺序由事件循环机制决定:同步代码→微任务(then回调)→宏任务(setTimeout),可通过console.log打点验证;构造函数内代码同步执行,then回调属微任务,Promise.all/race按各Promise settle时机触发对应then。
promise 的异步执行顺序不是靠“猜”或“背结论”,而是可以通过设计可观察的同步/异步标记来验证——核心是利用 console.log 作为时间戳探针,结合 javascript 事件循环中同步任务 → 微任务 → 宏任务的明确优先级。
用 console.log 打点标记执行时序
在关键位置插入带标识的 log(如 'A'、'B'、'then1'),让输出直接反映执行先后。注意:Promise 构造函数内的代码是同步立即执行,而 .then() 回调属于微任务,总在当前同步栈清空后、下一个宏任务前执行。
- 构造器内
console.log('1')和resolve()都是同步的,立刻输出 -
.then(() => console.log('2'))不会马上执行,而是排队进微任务队列 - 同一轮事件循环中,所有同步代码跑完,才批量执行微任务(FIFO)
对比 setTimeout 验证微任务优先级
把 setTimeout(宏任务)和 .then(微任务)放在一起,就能清晰看到微任务“插队”在宏任务之前:
- 同步代码(如
console.log('start'))最先输出 - 所有
.then回调紧随其后,在同一轮循环末尾集中执行 - 所有
setTimeout(..., 0)推迟到下一轮循环开头才执行
例如:Promise.resolve().then(() => console.log('p')) 和 setTimeout(() => console.log('t'), 0) 同时存在时,必先输出 p,再输出 t。
链式 then 的逐级触发逻辑
多个 .then 是链式注册、逐级入队的。前一个 .then 的回调执行完毕(无论是否返回 Promise),才会将下一个 .then 的回调加入微任务队列。
- 如果
.then(() => { console.log(1); })返回普通值,下一个.then立即排队 - 如果它
return Promise.resolve(),则下一个.then要等这个新 Promise resolve 后才入队 - 嵌套
.then不会提前“展开”,而是严格按链式顺序一层层推进
用 Promise.all 或 race 检查并发行为
多个 Promise 并发时,它们的构造函数同步执行,但各自的 .then 仍按 resolve 时间先后进入微任务队列(非严格 FIFO,但受 resolve 时机影响):
-
Promise.all([p1, p2])的.then在所有 Promise 都 resolve 后才触发 -
Promise.race([p1, p2])的.then由第一个 settle 的 Promise 决定 - 每个 Promise 的构造函数日志仍按代码书写顺序立即输出,不受 all/race 影响

















