在 worker.js 中接收并解析来自父线程的数据
onmessage = function(event) {
var intArray= JSON.parse(event.data);这几行代码是在 worker.js 中接收并解析来自父线程的数据。让我详细解释:
代码解析
onmessage = function(event) {onmessage是Worker线程的消息事件处理器当父线程(script.js)调用
worker.postMessage()时触发event参数是事件对象,包含发送的数据
var intArray = JSON.parse(event.data);
event.data包含从父线程发送过来的数据JSON.parse()将JSON字符串解析回JavaScript对象/数组结果赋值给
intArray变量,供后续使用
完整的通信流程
// script.js (父线程)
var intArray = [45, 67, 23, 89, 12, 56, 78, 34, 90, 11];
worker.postMessage(JSON.stringify(intArray));
// 发送: "[45,67,23,89,12,56,78,34,90,11]"
// worker.js (子线程)
onmessage = function(event) {
// event.data = "[45,67,23,89,12,56,78,34,90,11]"
var intArray = JSON.parse(event.data);
// intArray = [45,67,23,89,12,56,78,34,90,11] ← 恢复为真实数组
// 现在可以正常使用数组了
console.log(intArray[0]); // 45
console.log(intArray.length); // 100
console.log(Array.isArray(intArray)); // true
}如果没有JSON.parse会发生什么?
// 错误示例:忘记解析
onmessage = function(event) {
var intArray = event.data; // 直接使用字符串
// 问题1:不是数组,没有数组方法
intArray.forEach(...) // ❌ 报错:intArray.forEach is not a function
// 问题2:索引访问得到的是字符
console.log(intArray[0]); // "[" 不是 45
// 问题3:长度是字符串长度
console.log(intArray.length); // 可能是 389(字符串长度),不是100
}数据转换过程可视化
发送端 (script.js) 原始数组: [45, 67, 23, 89, 12] ↓ JSON.stringify: "[45,67,23,89,12]" ↓ postMessage发送 → [传输JSON字符串] ↓ 接收端 (worker.js) event.data: "[45,67,23,89,12]" ↓ JSON.parse: [45, 67, 23, 89, 12] ↓ 恢复为可用数组
JSON.parse的详细作用
// JSON字符串 → JavaScript对象/数组
// 1. 数组示例
JSON.parse("[45,67,23,89]")
// 结果: [45, 67, 23, 89] (真实数组)
// 2. 对象示例
JSON.parse('{"name":"test","value":123}')
// 结果: {name: "test", value: 123} (真实对象)
// 3. 复杂嵌套
JSON.parse('[[1,2],[3,4]]')
// 结果: [[1,2],[3,4]] (二维数组)完整的worker.js代码
onmessage = function(event) {
// 1. 接收JSON字符串并解析为数组
var intArray = JSON.parse(event.data);
// 2. 准备返回结果
var returnStr = "";
// 3. 筛选能被5整除的数
for(var i = 0; i < intArray.length; i++) {
if(parseInt(intArray[i]) % 5 == 0) {
if(returnStr != "")
returnStr += ";";
returnStr += intArray[i];
}
}
// 4. 返回结果给父线程
postMessage(returnStr);
// 5. 关闭线程
close();
}为什么这里需要JSON.parse?
在这个特定的代码中,因为父线程发送时使用了 JSON.stringify():
// 父线程发送时进行了序列化 worker.postMessage(JSON.stringify(intArray)); // 发送的是字符串,不是数组 // 所以子线程必须反序列化 var intArray = JSON.parse(event.data); // 才能恢复为数组使用
如果直接发送数组
如果父线程这样写:
worker.postMessage(intArray); // 直接发送数组,不JSON.stringify
那么子线程就可以直接使用:
onmessage = function(event) {
var intArray = event.data; // 直接就是数组
// 不需要JSON.parse
}总结
这几行代码的作用是:
监听消息:等待父线程发送数据
接收数据:通过
event.data获取JSON字符串解析数据:用
JSON.parse()将字符串转回数组准备处理:将解析后的数组赋值给变量供后续使用
这是Worker间通信的标准模式:发送前序列化,接收后反序列化。