Javascript 是否存在web工作人员的加载事件?

Javascript 是否存在web工作人员的加载事件?,javascript,web-worker,Javascript,Web 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 Bro

当我试图使用广播频道在主脚本和工作人员之间进行沟通时,我遇到了一些问题。我在主脚本中有以下代码:

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');
}
问题是,当从主脚本发出消息时,工作进程尚未加载,因此他们跳过了消息。我对此很确定,因为如果我这样做,效果会很好:

setTimeout(() => {
  channel.postMessage('1000');
}, 100)

加载辅助脚本后是否有方法触发回调?

根据最后一条评论,我将写下我的建议作为答案:


您可以让worker在加载时发出消息,并在主脚本上侦听该消息。 这通常是我们对网络工作者所做的:他们向主线程发送一条消息,说“我准备好接收东西了”

一种可能的实施方式可以是:

// 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");

我发现这个问题/答案试图解决web工作者的一个问题,在这个问题上,人们似乎无法立即发布到实例化的工作者

该解决方案比为所有不同的工作人员实现加载的消息更容易。只需传入一个名称,即可为每个工作者定义一个范围

const worker = new Worker("worker.js", { name: 'worker-type-1', type: 'module' );

这解决了问题的原因是,如果所有工人都是同一作用域(“”)的一部分,如果您在实例化工人后立即将其发布到该工人,则该发布将由同一作用域的第一个可用工人侦听。命名新工作进程可防止此问题。

您可以让工作进程在加载时发出消息,然后在主脚本上侦听该消息。这通常是我们对网络工作者所做的。他们向主线程发送一条消息,说“我准备好接收东西了”。哇,这是个好主意!谢谢大家!@ZER0听起来像是个答案,想发布吗?:)