网络工作者是否有某种加载事件?
Is there some kind of load event for web-workers?
我在尝试使用广播频道在主脚本和 worker 之间进行通信时遇到了一些问题。我在主脚本中有以下代码:
const channel = new BroadcastChannel('my_bus');
const worker = new Worker('worker.js');
const secondWorker = new Worker('second-worker.js');
channel.postMessage('1000');
以及两个工人中的相似代码:
const bc = new BroadcastChannel('my_bus');
bc.onmessage = () => {
console.log('worker get length');
}
问题是当消息从主脚本发出时,worker 还没有加载,所以他们跳过消息。我对此很确定,因为如果我这样做,它会很好地工作:
setTimeout(() => {
channel.postMessage('1000');
}, 100)
有没有什么方法可以在工作脚本加载后触发回调?
根据最后一条评论,我会写下我的建议作为答案:
您可以让工作人员在加载时发出一条消息,然后您在主脚本上收听该消息。
这通常是我们对网络工作者所做的:他们向主线程发出一条消息说 "I'm ready to receive stuff".
一个可能的实现可能是:
// assumes the first `message` from workers is always the "loaded" ones
const loaded = w =>
new Promise(r => w.addEventListener("message", r, { once: true }));
// Code runs inside async function, so we can use `await`
async function main() {
const channel = new BroadcastChannel("my_bus");
const worker = new Worker("worker.js");
const secondWorker = new Worker("second-worker.js");
await Promise.all([
loaded(worker),
loaded(secondWorker)
]);
// this will be post only once all the workers have been loaded
channel.postMessage("1000");
}
// call the main function
main();
工人代码如下所示:
const bc = new BroadcastChannel("my_bus");
bc.onmessage = () => {
console.log("worker get length");
};
postMessage("loaded");
我发现这个 Question/Answer 试图解决 Web Worker 的一个问题,在这个问题上似乎无法立即 post 实例化的 Worker。
该解决方案比为所有不同的工作人员实施加载消息更容易。只需传入一个名称即可为每个工作人员定义一个范围。
const worker = new Worker("worker.js", { name: 'worker-type-1', type: 'module' );
解决这个问题的原因是,如果所有工作人员都是同一范围的一部分 (''),如果您在实例化后立即 post 给工作人员,那么 post将由相同范围的第一个可用工作人员收听。命名新工作人员可防止此问题。
我在尝试使用广播频道在主脚本和 worker 之间进行通信时遇到了一些问题。我在主脚本中有以下代码:
const channel = new BroadcastChannel('my_bus');
const worker = new Worker('worker.js');
const secondWorker = new Worker('second-worker.js');
channel.postMessage('1000');
以及两个工人中的相似代码:
const bc = new BroadcastChannel('my_bus');
bc.onmessage = () => {
console.log('worker get length');
}
问题是当消息从主脚本发出时,worker 还没有加载,所以他们跳过消息。我对此很确定,因为如果我这样做,它会很好地工作:
setTimeout(() => {
channel.postMessage('1000');
}, 100)
有没有什么方法可以在工作脚本加载后触发回调?
根据最后一条评论,我会写下我的建议作为答案:
您可以让工作人员在加载时发出一条消息,然后您在主脚本上收听该消息。 这通常是我们对网络工作者所做的:他们向主线程发出一条消息说 "I'm ready to receive stuff".
一个可能的实现可能是:
// assumes the first `message` from workers is always the "loaded" ones
const loaded = w =>
new Promise(r => w.addEventListener("message", r, { once: true }));
// Code runs inside async function, so we can use `await`
async function main() {
const channel = new BroadcastChannel("my_bus");
const worker = new Worker("worker.js");
const secondWorker = new Worker("second-worker.js");
await Promise.all([
loaded(worker),
loaded(secondWorker)
]);
// this will be post only once all the workers have been loaded
channel.postMessage("1000");
}
// call the main function
main();
工人代码如下所示:
const bc = new BroadcastChannel("my_bus");
bc.onmessage = () => {
console.log("worker get length");
};
postMessage("loaded");
我发现这个 Question/Answer 试图解决 Web Worker 的一个问题,在这个问题上似乎无法立即 post 实例化的 Worker。
该解决方案比为所有不同的工作人员实施加载消息更容易。只需传入一个名称即可为每个工作人员定义一个范围。
const worker = new Worker("worker.js", { name: 'worker-type-1', type: 'module' );
解决这个问题的原因是,如果所有工作人员都是同一范围的一部分 (''),如果您在实例化后立即 post 给工作人员,那么 post将由相同范围的第一个可用工作人员收听。命名新工作人员可防止此问题。