Есть ли какое-то событие загрузки для веб-работников?

1

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

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)

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

  • 2
    Вы можете заставить работника отправлять сообщения, когда они загружены, и вы слушаете это сообщение в основном скрипте. Это обычно то, что мы делаем с веб-работниками. Они посылают сообщение в основной поток, чтобы сказать: «Я готов к получению материала».
  • 0
    Вау, это хорошая идея! Спасибо!
Показать ещё 1 комментарий
Теги:
web-worker

1 ответ

0

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню