同名变量绑定的多个Web Worker如何接收全部返回消息?
问题原因
- 你猜测的变量覆盖问题确实存在:使用
var声明的socketWorker存在变量提升,每次循环都会覆盖上一次创建的Worker实例引用 onmessage监听函数绑定写在了循环外部,仅最后一个Worker实例被绑定了消息监听逻辑,其余3个Worker发送的消息没有对应的处理函数,自然不会打印日志- 当前仅创建了4个Worker,若要实现总计8次输出,要么调整循环次数为8,要么让单个Worker输出2次消息
修复方案
方案1:创建8个Worker,每个输出1次(匹配你每个线程输出1次的需求)
修复后的main.js
// 用数组存储所有Worker实例,避免引用被意外覆盖 const workers = []; for (let workersAmount = 0; workersAmount < 8; workersAmount++) { const socketWorker = new Worker("worker.js"); // 循环内给每个Worker单独绑定消息监听 socketWorker.onmessage = function(event) { console.log(event.data); // 不需要继续通信可以手动销毁Worker释放资源 socketWorker.terminate(); } workers.push(socketWorker); }
worker.js无需修改,原有代码即可生效
postMessage("Why can't it just work!")
方案2:保留4个Worker,每个输出2次
如果不想创建8个线程,只需修改worker.js即可实现8次输出:
postMessage("Why can't it just work!") postMessage("Why can't it just work!")
内容的提问来源于stack exchange,提问作者user15708443
相关产品推荐
相关产品推荐

