promise.resolve().then(callback) 是最常用标准的微任务调度方式,它同步注册回调并确保在当前宏任务结束后立即执行,兼容性优于 queuemicrotask,且比 new promise(resolve => resolve()) 更高效。

直接用 Promise.resolve().then(callback) 就能把任务放进微任务队列,这是最常用、最标准的方式。
为什么 this works
Promise.resolve() 立即创建一个已 fulfilled 的 Promise;调用它的 .then() 会把回调函数注册为微任务,不依赖任何异步操作。这个过程完全同步触发注册,但执行严格推迟到当前宏任务结束后、下一个宏任务开始前。
它和 queueMicrotask() 效果一致,且兼容性更好(queueMicrotask 在旧版 Safari 或某些 Node.js 版本中可能不可用)。
基本写法与注意事项
推荐写法:
Promise.resolve().then(() => { /* 你的高优逻辑 */ });- 如果需要传参或复用,可封装成函数:
function nextTick(cb) { Promise.resolve().then(cb); }
然后调用nextTick(() => doSomething()); - 避免写成
new Promise(resolve => resolve()).then(...)—— 构造函数里同步 resolve 虽然可行,但多一层开销,不如Promise.resolve()直观高效
与其他方式的优先级对比
在主流引擎(如 V8)中,Promise.then 回调和 queueMicrotask 共享同一微任务队列,按插入顺序 FIFO 执行。但要注意:
-
process.nextTick(仅 Node.js)优先级略高于 Promise 微任务,但浏览器不可用,不跨平台 -
MutationObserver也是微任务,但设计目标是 DOM 变更监听,用作通用调度属于误用,且 API 更重 -
setTimeout(fn, 0)是宏任务,一定晚于所有微任务,不能用于“高优先级”场景
实际应用场景
适合需要“尽快执行、但不打断当前同步流程”的时机,例如:
- 状态更新后,确保 DOM 渲染前完成副作用清理(比如移除临时 class)
- 避免 setState 多次合并时的竞态,统一收口到下一轮微任务
- 实现轻量级的“异步边界”,让调用方代码能继续同步执行,再交出控制权
- 在库中做非阻塞的初始化或回调派发,不抢占当前堆栈











