Я столкнулся с некоторыми проблемами при попытке использовать широковещательный канал для связи между основным сценарием и рабочими. У меня есть код ниже в главном скрипте:
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)
Есть ли способ вызвать обратный вызов после загрузки сценария рабочего?
В соответствии с последним комментарием я напишу свое предложение в качестве ответа:
Вы можете заставить работника отправлять сообщения, когда они загружены, и вы слушаете это сообщение в основном скрипте. Это обычно то, что мы делаем с веб-работниками: они посылают сообщение в главный поток, чтобы сказать: "Я готов к получению материала".
Возможная реализация может быть:
// 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");