ServiceWorker:postMessage() 方法
注意:此功能在 Web Workers 中可用。
postMessage() 方法是 ServiceWorker 接口的一部分,用于将消息发送到 worker。第一个参数是要发送到 worker 的数据。数据可以是任何能够被 结构化克隆算法 处理的 JavaScript 对象。
Service worker 可以使用 postMessage() 方法将信息发送回其客户端。消息不会发送回此 ServiceWorker 对象,而是发送到可通过 navigator.serviceWorker 访问的关联的 ServiceWorkerContainer。
语法
postMessage(message)
postMessage(message, transfer)
postMessage(message, options)
参数
message-
要传递给 worker 的对象;这将是传递给
message事件的data字段。这可以是任何能够被 结构化克隆算法 处理的 JavaScript 对象。message参数是强制性的。如果要在 worker 中传递的数据不重要,则必须显式传递null或undefined。注意: Service worker 与其客户端不在同一个 代理集群 中,因此无法共享内存。无法跨代理集群发送
SharedArrayBuffer对象或由其支持的缓冲区视图。尝试这样做会在接收端生成一个包含DataCloneErrorDOMException的messageerror事件。 transfer可选-
一个可选的可传输对象数组,用于转移所有权。这些对象的所有权将转移到目标方,并且它们在发送方不再可用。这些可传输对象应该附加到消息中;否则它们将被移动,但在接收端实际上无法访问。
options可选-
一个包含以下属性的可选对象
transfer可选-
与
transfer参数具有相同的含义。
返回值
无(undefined)。
异常
SyntaxError-
如果未提供
message参数,则会抛出此异常。
示例
在此示例中,创建了一个 ServiceWorker 并立即发送了一条消息。
navigator.serviceWorker.register("service-worker.js");
navigator.serviceWorker.ready.then((registration) => {
registration.active.postMessage(
"Test message sent immediately after creation",
);
});
为了接收消息,Service worker(在 service-worker.js 文件中)必须在其全局作用域上监听 message 事件。
// This must be in `service-worker.js`
addEventListener("message", (event) => {
console.log(`Message received: ${event.data}`);
});
请注意,Service worker 可以使用 postMessage() 方法将消息发送回主线程。要接收它,主线程需要监听 ServiceWorkerContainer 对象上的 message 事件。
规范
| 规范 |
|---|
| Service Workers # dom-serviceworker-postmessage |
| Service Workers # dom-serviceworker-postmessage-message-options |
浏览器兼容性
加载中…
另见
- 它所属的
ServiceWorker接口。 - 它的对应方法,即 Service worker 必须使用
postMessage()方法将消息发送回关联的ServiceWorkerContainer。