`postMessage` is not synchronous

380 views
Skip to first unread message

兰陈昕

unread,
Mar 19, 2022, 3:50:25 PM3/19/22
to Chromium HTML5
I have a piece of code that behaves differently in Chromium and Firefox.

```javascript
// window.js
const worker = new Worker("worker.js");

// worker.js
const worker = new Worker("worker2.js", { name: "2" });
const sab = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));

worker.postMessage(0);
Atomics.wait(sab, 0, 0);

// worker2.js
onmessage = ({ data }) => console.log(data);
```

In Chromium, the worker2` never receives the message because `Atomics.wait` blocks `postMessage`, but I want to send the message synchronously .

Quality Content

unread,
Jan 24, 2023, 6:03:30 PM1/24/23
to Chromium HTML5, 兰陈昕
## Solution


```javascript
// window.js
const worker = new Worker("worker.js");

// worker.js
const worker = new Worker("worker2.js", { name: "2" });
const sab = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));

worker.postMessage(0);
Atomics.wait(sab, 0, 0);

// worker2.js
onmessage = ({ data }) => console.log(data);
```

## References

- [MDN: SharedArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer)
- [MDN: Atomics](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics)
- [MDN: Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker)
- [MDN: postMessage](https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage)
- [MDN: onmessage](https://developer.mozilla.org/en-US/docs/Web/API/Worker/onmessage)
- [MDN: Atomics.wait](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait)
- [MDN: Atomics.wake](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wake)
- [MDN: Int32Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int32Array)
- [MDN: Int32Array.BYTES_PER_ELEMENT](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int32Array/BYTES_PER_ELEMENT)
Reply all
Reply to author
Forward
0 new messages