Worker: 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 July 2015.

Note: This feature is available in Web Workers, except for Service Workers.

Phương thức postMessage() của giao diện Worker gửi một thông điệp tới worker. Tham số đầu tiên là dữ liệu cần gửi tới 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 structured clone.

Phương thức postMessage() của Worker ủy quyền cho phương thức postMessage() của MessagePort, thêm một tác vụ vào vòng lặp sự kiện tương ứng với MessagePort nhận.

Worker có thể gửi lại thông tin tới thread đã sinh ra nó bằng cách sử dụng phương thức DedicatedWorkerGlobalScope.postMessage.

Cú pháp

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

Tham số

message

Đối tượng cần gửi tới worker; dữ liệu này sẽ nằm trong trường data của event được gửi tới event message. Đây có thể là bất kỳ giá trị hoặc đối tượng JavaScript nào được xử lý bởi thuật toán structured clone, bao gồm các tham chiếu tuần hoàn.

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

transfer Optional

Một mảng tùy chọn các đối tượng có thể chuyển quyề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 sang phía nhận và chúng không còn khả dụng ở phía gửi. Các đối tượng có thể chuyển quyền này nên được gắn 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ó cùng ý nghĩa với tham số transfer.

Giá trị trả về

Không có (undefined).

Ví dụ

Đoạn mã sau hiển thị việc tạo một đối tượng Worker bằng cách sử dụng hàm tạo Worker(). Khi một trong hai input của form (firstsecond) có giá trị thay đổi, các event change gọi postMessage() để gửi giá trị của cả hai input tới worker hiện tại.

js
const myWorker = new Worker("worker.js");

[first, second].forEach((input) => {
  input.onchange = () => {
    myWorker.postMessage([first.value, second.value]);
    console.log("Message posted to worker");
  };
});

Để biết ví dụ đầy đủ, xem ví dụ worker đơn giản (chạy ví dụ).

Note: postMessage() chỉ có thể gửi một đối tượng tại một thời điểm. Như đã thấy ở trên, nếu bạn muốn truyền nhiều giá trị, bạn có thể gửi một mảng.

Ví dụ Transfer

Ví dụ tối thiểu này có main tạo một ArrayBuffer và chuyển nó tới myWorker, sau đó myWorker chuyển nó trở lại main, với kích thước được ghi lại ở mỗi bước.

Mã main.js

js
// tạo worker
const myWorker = new Worker("myWorker.js");

// lắng nghe myWorker chuyển buffer trở lại main
myWorker.addEventListener("message", (msg) => {
  console.log("message from worker received in main:", msg);

  const bufTransferredBackFromWorker = msg.data;

  console.log(
    "buf.byteLength in main AFTER transfer back from worker:",
    bufTransferredBackFromWorker.byteLength,
  );
});

// tạo buffer
const myBuf = new ArrayBuffer(8);

console.log(
  "buf.byteLength in main BEFORE transfer to worker:",
  myBuf.byteLength,
);

// gửi myBuf tới myWorker và chuyển ArrayBuffer cơ bản
myWorker.postMessage(myBuf, [myBuf]);

console.log(
  "buf.byteLength in main AFTER transfer to worker:",
  myBuf.byteLength,
);

Mã myWorker.js

js
// lắng nghe main chuyển buffer tới myWorker
self.onmessage = (msg) => {
  console.log("message from main received in worker:", msg);

  const bufTransferredFromMain = msg.data;

  console.log(
    "buf.byteLength in worker BEFORE transfer back to main:",
    bufTransferredFromMain.byteLength,
  );

  // gửi buf trở lại main và chuyển ArrayBuffer cơ bản
  self.postMessage(bufTransferredFromMain, [bufTransferredFromMain]);

  console.log(
    "buf.byteLength in worker AFTER transfer back to main:",
    bufTransferredFromMain.byteLength,
  );
};

Output được ghi lại

bash
buf.byteLength in main BEFORE transfer to worker:        8                     main.js:19
buf.byteLength in main AFTER transfer to worker:         0                     main.js:27

message from main received in worker:                    MessageEvent { ... }  myWorker.js:3
buf.byteLength in worker BEFORE transfer back to main:   8                     myWorker.js:7
buf.byteLength in worker AFTER transfer back to main:    0                     myWorker.js:15

message from worker received in main:                    MessageEvent { ... }  main.js:6
buf.byteLength in main AFTER transfer back from worker:  8                     main.js:10

byteLength giảm xuống 0 sau khi ArrayBuffer được chuyển. Để biết ví dụ đầy đủ phức tạp hơn về việc transfer ArrayBuffer, xem Firefox demo add-on này: GitHub :: ChromeWorker - demo-transfer-arraybuffer

Đặc tả kỹ thuật

Specification
HTML
# dom-worker-postmessage-dev

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

Xem thêm

  • Giao diện Worker mà nó thuộc về.