11.宏任务-MessageChannel
wabicai
# 11.宏任务-MessageChannel
# MessageChannel 是什么
MessageChannel 提供了两个互通的端口,可以在同一页面、不同上下文之间异步传递消息。它常被用来创建一个比 setTimeout(fn, 0) 更稳定的异步任务调度通道。
# 为什么它常和宏任务一起讨论
浏览器会把 port.postMessage() 产生的回调放入任务队列。它不是微任务,因此不会像 Promise.then 那样在当前宏任务结束后立刻连续清空。
# 示例
const channel = new MessageChannel();
channel.port1.onmessage = () => {
console.log('异步任务执行');
};
channel.port2.postMessage('run');
1
2
3
4
5
6
7
2
3
4
5
6
7
# 和 setTimeout 的区别
MessageChannel不依赖最小定时器精度。- 调度开销通常更低。
- 更适合做内部任务切片或调度器实现。
# 适用场景
- 框架内部调度异步更新。
- 把同步重任务拆成多段异步执行。
- 模拟一个稳定的任务队列。