11.宏任务-MessageChannel

# 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

# 和 setTimeout 的区别

  • MessageChannel 不依赖最小定时器精度。
  • 调度开销通常更低。
  • 更适合做内部任务切片或调度器实现。

# 适用场景

  • 框架内部调度异步更新。
  • 把同步重任务拆成多段异步执行。
  • 模拟一个稳定的任务队列。
Last Updated: 9/25/2026, 2:08:32 PM