前端知库

为什么不断追加微任务会阻塞页面响应?

参考答案

在微任务检查点,浏览器会继续处理队列中新增的微任务,直到队列清空。递归调用 queueMicrotask 或不断衔接已兑现 Promise,可能让输入处理和渲染长期得不到机会。

因此把一个大循环拆成许多 Promise 回调,并不自然等于把工作让给页面。await 已兑现 Promise 也不能保证浏览器在每步之间绘制。微任务适合需要在当前同步工作结束后统一处理的小任务,不适合作为无界计算的调度器。

较重工作应分批让出主线程,或在合适情况下移到 Worker。具体选择需要测量任务时长、输入延迟和通信成本;即使使用定时器分批,也不能承诺每次回调之间必定发生一次渲染。