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。