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

瀏覽器相容性

另見