什么是 MessageChannel
MessageChannel 允许两个不同的脚本运行在同一个文档的不同浏览器上下文(例如两个 iframe,文档主体和一个 iframe,使用 SharedWorker 的两个文档,或两个 worker)来直接通讯,在每端使用一个端口(port)通过双向频道(channel)向彼此传递消息。
MessageChannel 是以
DOM Event
的形式发送消息,所以它属于异步的宏任务。
基本用法
- 使用
MessageChannel()
构造函数来创建通讯信道,获取两个端口 MessagePort 对象port1
port2
; - 一个端口使用
postMessage
发送消息,另一个端口通过onmessage
接收消息; - 另一个端口通过
onmessage
接收消息; - 当端口收到无法反序列化的消息时,使用
onmessageerror
处理; - 停止发送消息时,调用
close
关闭端口;function deepClone (obj, cbk) { const { port1, port2 } = new MessageChannel() port1.postMessage(obj) port2.onmessage = ((e) => { cbk(e.data) }) } let obj = { a: 1, b: [2, 3], c: null, d: undefined } deepClone(obj, (copyData) => { copyData.a = 2 console.log(copyData, obj) console.log(copyData === obj) })