【发布时间】:2020-11-27 13:36:58
【问题描述】:
我提交了a crash report to Firefox,但我也想确保我没有写错或规范禁止的内容。
在下面的sn-p中:
- 主进程创建一个 web worker
- 主进程创建
MessageChannel - 主进程发送
port2给web worker - Web Worker 确认接收到端口
- 主进程在通道上发送消息请求实际工作
- 网络工作者创建 1000 个
ArrayBuffers 并将它们传回
如标题所述,这段代码几乎每次都会让 Firefox 崩溃。我尝试发送不同数量的缓冲区,看起来分水岭约为 170 个缓冲区。具体来说,我的印象是,在 171 之前,Firefox 不会崩溃,但在 171 到 174 之间,事情会变得很奇怪(因为窗口变得没有响应,工作人员没有返回任何东西)并且在 175 时它总是崩溃。
我的代码是错误的还是 Firefox 的错误/限制?
Chrome、Edge 和 Safari 似乎对代码没问题。
addEventListener("load", () => {
const workerSrc = document.getElementById("worker-src").innerText;
const src = URL.createObjectURL(new Blob([workerSrc], { type: "application/javascript" }));
const btn = document.createElement("button");
btn.innerText = "Click me!";
btn.addEventListener("click", () => {
const worker = new Worker(src);
const channel = new MessageChannel();
channel.port1.addEventListener("message", (message) => {
if (message.data.name === "messagePortResult") {
channel.port1.postMessage({ name: "getBuffers" });
} else if (message.data.name === "getBuffersResult") {
console.log("This is what I got back from the worker: ", message.data.data);
}
});
channel.port1.start();
worker.postMessage({ name: "messagePort", port: channel.port2 }, [channel.port2]);
});
document.body.appendChild(btn);
});
<script id="worker-src" type="x-js/x-worker">
let port = null;
addEventListener("message", (message) => {
if (message.data.name === "messagePort") {
port = message.data.port;
port.addEventListener("message", () => {
const buffers = [];
for (let i = 0; i < 1000; i++) {
buffers.push(new ArrayBuffer(1024));
}
port.postMessage({ name: "getBuffersResult", data: buffers }, buffers);
});
port.start();
port.postMessage({ name: "messagePortResult" });
}
});
</script>
【问题讨论】:
标签: javascript web-worker postmessage