web worker 中需显式注册 onmessage 处理器来监听主线程消息,推荐 self.onmessage = function(e) { };e.data 是结构化克隆副本,支持多种类型但不支持函数等;响应须调用 self.postmessage(),大数据可用 transferable 优化;还需监听 onmessageerror 和 onerror 做错误兜底。

在 Web Worker 子线程中监听并处理主线程消息,核心就是正确设置 onmessage 事件处理器。它不是自动生效的“魔法接口”,而是必须显式注册、绑定在 Worker 全局作用域上的标准入口。
必须显式注册 onmessage 处理器
Worker 脚本启动后,不会默认监听任何消息。你需要在 worker.js 开头就写明如何接收数据:
-
推荐写法(语义清晰、兼容性好):
self.onmessage = function(e) { console.log('收到:', e.data); }; - 等价写法(适合需动态增删监听时):
self.addEventListener('message', function(e) { /* 处理逻辑 */ }); - 注意:
this.onmessage也可用,但self更明确指向 Worker 全局对象,避免上下文歧义
消息数据是结构化克隆后的原值,不是字符串
e.data 不是 JSON 字符串,也不是经过序列化的文本,而是主线程传入数据的结构化克隆副本。你可直接使用原始类型和嵌套结构:
- 支持:字符串、数字、布尔、
null、Array、Object、Map、Set、Date、ArrayBuffer、Uint8Array、Blob - 不支持:函数、
Promise、RegExp(部分旧环境)、DOM 节点、window或document引用——这类值会被静默丢弃,或触发onmessageerror
处理完后必须用 postMessage 主动回传
Worker 无法修改主线程变量,也不能“返回值”。要通知主线程结果,必须调用 self.postMessage():
- 基本用法:
self.postMessage({ result: computedData }); - 大数据量建议用 transferable 优化性能:
self.postMessage({ id: 'task-1', buffer }, [buffer]);(buffer将被移出当前上下文,零拷贝传输) - 主线程通过
worker.onmessage接收该响应,e.data即为这里传入的内容
别忘了错误兜底:监听 messageerror 和 error
仅靠 onmessage 无法覆盖通信异常:
-
self.onmessageerror:主线程发送了不可克隆的数据(如含函数的对象)时触发,e.data为空,e.source为null;建议开头统一监听并记录日志 -
self.onerror:捕获 Worker 内部运行时错误(如语法错误、未捕获异常),但不拦截通信层问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











