ServiceWorker:postMessage() 方法

Baseline 已广泛支持

此功能已成熟,可跨多种设备和浏览器版本工作。它自 ⁨2018 年 4 月⁩ 起已在所有浏览器中可用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

postMessage() 方法是 ServiceWorker 接口的一部分,用于将消息发送到 worker。第一个参数是要发送到 worker 的数据。数据可以是任何能够被 结构化克隆算法 处理的 JavaScript 对象。

Service worker 可以使用 postMessage() 方法将信息发送回其客户端。消息不会发送回此 ServiceWorker 对象,而是发送到可通过 navigator.serviceWorker 访问的关联的 ServiceWorkerContainer

语法

js
postMessage(message)
postMessage(message, transfer)
postMessage(message, options)

参数

message

要传递给 worker 的对象;这将是传递给 message 事件的 data 字段。这可以是任何能够被 结构化克隆算法 处理的 JavaScript 对象。

message 参数是强制性的。如果要在 worker 中传递的数据不重要,则必须显式传递 nullundefined

注意: Service worker 与其客户端不在同一个 代理集群 中,因此无法共享内存。无法跨代理集群发送 SharedArrayBuffer 对象或由其支持的缓冲区视图。尝试这样做会在接收端生成一个包含 DataCloneError DOMExceptionmessageerror 事件。

transfer 可选

一个可选的可传输对象数组,用于转移所有权。这些对象的所有权将转移到目标方,并且它们在发送方不再可用。这些可传输对象应该附加到消息中;否则它们将被移动,但在接收端实际上无法访问。

options 可选

一个包含以下属性的可选对象

transfer 可选

transfer 参数具有相同的含义。

返回值

无(undefined)。

异常

SyntaxError

如果未提供 message 参数,则会抛出此异常。

示例

在此示例中,创建了一个 ServiceWorker 并立即发送了一条消息。

js
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 事件。

js
// 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

浏览器兼容性

另见