MessageChannel & Broadcast Channel API


通过 postMessage 发送(不转让) TypedArray 实际上是复制底层的 ArrayBuffer 传输

MessageChannel.port1 & MessageChannel.port2 前者是访问源的端口,或者是发送方进行channel转让的端口

var channel = new MessageChannel();
channel.port1.onmessage = fun // worker 中 e.source/ports[0]
otherWindow.postMessage('Hello from the main page!', '*', [channel.port2]);
other page : e.ports[0] 读取转让过来的对象 channel.port1
使用addEventListener监听时需要start(), 不要监听了就close();
myWorker.postMessage(aMessage, transferList);
Transferable(可转让对象): The ArrayBuffer and MessagePort implement it.
var arrbuf = new ArrayBuffer(8);
myWorker.postMessage({
aTopic: 'do_sendWorkerArrBuff',
aBuf: arrBuf // The array buffer that we passed to the transferrable section 3 lines below
}, [ arrbuf ] );
转让完之后源 转让对象arrbuf 变为空,arrbuf.bytelength = 0;
otherWindow是谁就发送给谁/从谁那里接受消息, 并且这个目标还要符合 指定的源
发送的event.ports 就是MessageChannel,可以双向通信
发送的event.source 表示发送消息的windowClient/MessageChannel, 能指明目标,不能传递数据
Client.postMessage() : Allows a service worker to send a message to a ServiceWorkerClient.
// navigator.serviceWorker.onmessage() 而不是 window.onmessage;
而worker发送消息直接通过self: self.postMessage({aTopic:'do_sendMainArrBuff', aBuf:aBuf}, [aBuf]);
window.postMessage,调用时,挂起的脚本必须执行完成才会将 MessageEvent 派遣至目标window (例如:如果一个事件处理程序调用了window.postMessage,剩余的事件处理程序就会挂起超时等)。

//////////////////
Broadcast Channel API , 同源下建立/加入通道就可以发送/接受消息, 不需要引用特定window
// 也可以用service worker 替代