ServiceWorker: phương thức postMessage()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2018.

Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.

Note: This feature is available in Web Workers.

Phương thức postMessage() của giao diện ServiceWorker gửi một thông điệp đến worker. Tham số đầu tiên là dữ liệu cần gửi đến worker. Dữ liệu có thể là bất kỳ đối tượng JavaScript nào có thể được xử lý bởi thuật toán sao chép theo cấu trúc.

Service worker có thể gửi thông tin trở lại các client của nó bằng cách sử dụng phương thức postMessage(). Thông điệp sẽ không được gửi trở lại đối tượng ServiceWorker này mà đến ServiceWorkerContainer được liên kết, khả dụng thông qua navigator.serviceWorker.

Cú pháp

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

Tham số

message

Đối tượng cần chuyển đến worker; đối tượng này sẽ nằm trong trường data của sự kiện được chuyển đến sự kiện message. Đây có thể là bất kỳ đối tượng JavaScript nào được xử lý bởi thuật toán sao chép theo cấu trúc.

Tham số message là bắt buộc. Nếu dữ liệu cần truyền đến worker không quan trọng, phải truyền rõ ràng null hoặc undefined.

Note: Service worker không nằm trong cùng nhóm agent với client của nó, do đó không thể chia sẻ bộ nhớ. Các đối tượng SharedArrayBuffer, hoặc các buffer view được hỗ trợ bởi nó, không thể được đăng qua các nhóm agent. Việc cố gắng làm vậy sẽ tạo ra sự kiện messageerror chứa DOMException DataCloneError ở đầu nhận.

transfer Optional

Một mảng các đối tượng có thể chuyển nhượng tùy chọn để chuyển quyền sở hữu. Quyền sở hữu của các đối tượng này được chuyển cho phía đích và chúng không còn khả dụng ở phía gửi. Các đối tượng có thể chuyển nhượng này nên được đính kèm vào thông điệp; nếu không chúng sẽ được di chuyển nhưng thực sự không thể truy cập ở đầu nhận.

options Optional

Một đối tượng tùy chọn chứa các thuộc tính sau:

transfer Optional

Có ý nghĩa giống như tham số transfer.

Giá trị trả về

Không có (undefined).

Ngoại lệ

SyntaxError

Được ném ra nếu tham số message không được cung cấp.

Ví dụ

Trong ví dụ này, một ServiceWorker được tạo và một thông điệp được gửi ngay lập tức:

js
navigator.serviceWorker.register("service-worker.js");

navigator.serviceWorker.ready.then((registration) => {
  registration.active.postMessage(
    "Test message sent immediately after creation",
  );
});

Để nhận thông điệp, service worker, trong service-worker.js, phải lắng nghe sự kiện message trên phạm vi toàn cục của nó.

js
// Đoạn này phải nằm trong `service-worker.js`
addEventListener("message", (event) => {
  console.log(`Message received: ${event.data}`);
});

Lưu ý rằng service worker có thể gửi thông điệp trở lại luồng chính bằng cách sử dụng phương thức postMessage(). Để nhận nó, luồng chính cần lắng nghe sự kiện message trên đối tượng ServiceWorkerContainer.

Đặc tả kỹ thuật

Specification
Service Workers Nightly
# dom-serviceworker-postmessage
Service Workers Nightly
# dom-serviceworker-postmessage-message-options

Tương thích trình duyệt

Xem thêm