您好!欢迎访问家园网-www.jy.wang!

家园网

在 worker.js 中接收并解析来自父线程的数据

网络 作者:本站 点击:

在 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
}

总结

这几行代码的作用是:

  1. 监听消息:等待父线程发送数据

  2. 接收数据:通过event.data获取JSON字符串

  3. 解析数据:用JSON.parse()将字符串转回数组

  4. 准备处理:将解析后的数组赋值给变量供后续使用

这是Worker间通信的标准模式:发送前序列化,接收后反序列化

标签: