Есть ли какое-то событие загрузки для веб-работников? - PullRequest
0 голосов
/ 12 июня 2018

Я столкнулся с некоторой проблемой, когда пытался использовать широковещательный канал для связи между основным сценарием и работниками.У меня есть код ниже в основном сценарии:

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)

Есть ли способ вызвать обратный вызов после загрузки рабочего скрипта?

1 Ответ

0 голосов
/ 16 апреля 2019

В соответствии с последним комментарием я напишу свое предложение как ответ:

Вы можете заставить работника выдавать сообщение, когда они загружены, и вы слушаете это сообщение в основном скрипте.Это обычно то, что мы делаем с веб-работниками: они посылают сообщение в основной поток, чтобы сказать: «Я готов к получению материала».

Возможная реализация может быть:

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