组件:后台任务

后台任务组件是一个不可视组件,基于 Web Worker 技术,用于在后台线程中执行耗时的 JavaScript 代码,而不会阻塞主线程(UI 渲染)。它支持加载外部脚本、发送和接收消息、终止任务等操作。适用于复杂计算、大数据处理、图像处理、文件解析等需要长时间运行的场景。

典型使用场景:

  • 大量数据计算(排序、过滤、统计分析)
  • 图像/视频处理(滤镜、压缩、格式转换)
  • 大文件解析(CSV、JSON、XML 大文件)
  • 加密/解密操作(密码哈希、数据加解密)
  • 后台定时轮询或数据同步

快速索引

你想知道什么直接看这里
如何加载 Worker 脚本加载文件(Worker脚本路径)
如何向 Worker 发送消息发送消息(数据)
如何接收 Worker 消息置收到消息回调(回调函数)
如何终止 Worker停止()
如何重新加载 Worker重新加载(Worker脚本路径)
如何检查 Worker 是否在运行取状态()
如何监听 Worker 错误置发生错误回调(回调函数)
组件与主线程的关系见下方“与主线程的区别”

基础示例

最简单的后台任务使用流程:加载 Worker → 发送数据 → 接收结果 → 终止 Worker。

变量 worker = 创建 后台任务()

' 1. 设置事件回调(需在加载前设置)
worker.置收到消息回调((事件源) => {
    调试输出("✅ Worker 返回结果:" + 事件源.data)
})

worker.置发生错误回调((事件源) => {
    调试输出("❌ Worker 错误:" + 事件源.message)
})

' 2. 加载 Worker 脚本文件(该文件需独立编写,运行在 Worker 线程中)
变量 是否支持 = worker.加载文件("static/worker.js")
如果(是否支持 == 假)
    弹出提示("当前浏览器不支持 Web Worker")
    返回
结束 如果

' 3. 向 Worker 发送数据
worker.发送消息({ action: "calculate", data: [1, 2, 3, 4, 5] })

' 4. 等待结果(在回调中接收)

' 5. 使用完毕后终止 Worker(释放资源)
延时执行(() => {
    worker.停止()
    调试输出("Worker 已终止")
}, 10000)

综合示例:大数据排序与统计

本示例模拟一个大数据处理场景:主线程生成一个包含 10 万条记录的数组,发送给 Worker 进行排序和统计,Worker 处理完成后返回结果,主线程更新 UI。

' ========== 创建 Worker 客户端 ==========
变量 worker = 创建 后台任务()

' ========== 设置事件回调 ==========
' 接收消息
worker.置收到消息回调((事件源) => {
    变量 数据 = 事件源.data
    ' 假设 Worker 返回 JSON 格式的结果
    变量 结果 = JSON解析(数据)
    调试输出("📊 处理完成!")
    调试输出("  排序后前 10 条:" + JSON编码(结果.前10条))
    调试输出("  平均值:" + 结果.平均值)
    调试输出("  最大值:" + 结果.最大值)
    调试输出("  最小值:" + 结果.最小值)
    弹出提示("数据处理完成!共 " + 结果.总数 + " 条记录")
})

' 监听错误
worker.置发生错误回调((事件源) => {
    调试输出("❌ Worker 错误:" + 事件源.message)
    弹出提示("计算过程中发生错误,请检查 Worker 脚本")
})

' ========== 加载 Worker 脚本 ==========
变量 加载成功 = worker.加载文件("static/data_worker.js")
如果(加载成功 == 假)
    弹出提示("浏览器不支持 Web Worker,无法执行后台任务")
    返回
结束 如果

' ========== 生成模拟数据(10万条) ==========
变量 数据列表 = []
变量循环(i = 1, 100001, 1)
    添加成员(数据列表, 取随机整数(1, 10000))
结束循环
调试输出("📦 已生成 " + 取数组成员数(数据列表) + " 条数据")

' ========== 发送数据给 Worker 处理 ==========
变量 消息 = {
    action: "sort_and_stats",
    data: 数据列表
}
worker.发送消息(JSON编码(消息))

' ========== 在页面关闭时清理资源 ==========
事件 页面被关闭()
    worker.停止()
结束 事件

配套 Worker 脚本示例(static/data_worker.js):

// 监听主线程消息
self.onmessage = function(event) {
    var data = event.data;
    
    if (data.action === "sort_and_stats") {
        var list = data.data;
        var total = list.length;
        
        // 执行排序(耗时操作)
        var sorted = list.slice().sort(function(a, b) { return a - b; });
        
        // 计算统计值
        var sum = 0;
        for (var i = 0; i < total; i++) {
            sum += list[i];
        }
        var avg = sum / total;
        var max = sorted[total - 1];
        var min = sorted[0];
        var top10 = sorted.slice(0, 10);
        
        // 返回结果给主线程
        self.postMessage(JSON.stringify({
            total: total,
            前10条: top10,
            平均值: avg,
            最大值: max,
            最小值: min
        }));
    }
};

// 错误处理
self.onerror = function(error) {
    console.error("Worker 内部错误:", error);
    self.postMessage(JSON.stringify({ error: error.message }));
};

函数详解

加载文件(Worker脚本路径)

  • 功能: 加载指定的 Worker 脚本文件,创建 Worker 线程。若浏览器不支持 Web Worker,返回
  • 参数: Worker脚本路径(文本型),相对于项目的脚本文件路径(通常放在 static/ 目录下)。
  • 返回值: 逻辑型, 表示浏览器支持且加载成功; 表示不支持。
  • 示例: worker.加载文件("static/task.js")

发送消息(数据)

  • 功能: 向 Worker 线程发送消息。数据会被拷贝到 Worker 线程中(而非共享引用)。
  • 参数: 数据,可以是文本、数字、数组、对象等,但必须可序列化为 JSON(不能包含函数)。
  • 返回值: 无。
  • 示例: worker.发送消息({ cmd: "start", id: 123 })

停止()

  • 功能: 立即终止 Worker 线程,释放资源。终止后 Worker 无法再发送或接收消息,如需重新使用需再次调用 加载文件
  • 返回值: 无。
  • 示例: worker.停止()

重新加载(Worker脚本路径)

  • 功能: 终止当前 Worker(如果存在)并使用指定的脚本路径重新创建 Worker。
  • 参数: Worker脚本路径(文本型,可选),若省略则使用上次加载的路径。
  • 返回值: 无。
  • 示例: worker.重新加载()worker.重新加载("static/new_worker.js")

取状态()

  • 功能: 获取当前 Worker 是否正在运行。
  • 返回值: 逻辑型, 表示 Worker 正在运行; 表示未加载或已停止。
  • 示例: 如果(worker.取状态()) 调试输出("Worker 运行中")

回调设置函数

所有回调函数必须在调用 加载文件 之前设置,否则可能错过早期消息。

置收到消息回调(回调函数)

  • 功能: 设置接收 Worker 消息时的回调函数。
  • 参数: 回调函数,格式为 (事件源) => { ... }事件源.data 为 Worker 发送的数据。
  • 示例:
    worker.置收到消息回调((事件源) => {
        调试输出("Worker 返回:" + 事件源.data)
    })
    

置发生错误回调(回调函数)

  • 功能: 设置 Worker 发生错误时的回调函数(如脚本语法错误、运行时异常等)。
  • 参数: 回调函数,格式为 (事件源) => { ... }事件源.message 包含错误信息。
  • 示例:
    worker.置发生错误回调((事件源) => {
        调试输出("Worker 内部错误:" + 事件源.message)
    })
    

事件说明

后台任务组件的事件与上述回调函数一一对应。

事件对应回调触发时机
收到消息(事件源)置收到消息回调Worker 发送消息给主线程
发生错误(事件源)置发生错误回调Worker 内部发生错误

与主线程的区别

维度主线程(UI 线程)Worker 线程(后台任务)
DOM 操作✅ 可以❌ 不可以
UI 渲染✅ 可以❌ 不可以
window 对象✅ 可访问❌ 不可访问
document 对象✅ 可访问❌ 不可访问
alert / 弹出提示✅ 可以❌ 不可以(需通过消息通知主线程)
资源共享❌ 不能共享内存(数据通过拷贝传递)
执行阻塞会阻塞 UI不会阻塞 UI
适用场景交互逻辑、UI 更新计算、解析、耗时操作

⚠️ 注意事项

  1. 脚本独立性:Worker 脚本是独立运行的,不能直接访问主线程的变量、函数或 DOM。所有数据交换需通过 发送消息置收到消息回调 实现。
  2. 数据拷贝:主线程与 Worker 之间的数据传递是值拷贝(而非引用传递),大数据量时会有性能开销。
  3. 浏览器支持:Web Worker 在现代浏览器中广泛支持,但 IE 等旧浏览器不支持。可通过 加载文件 的返回值判断。
  4. 跨域限制:Worker 脚本需与页面同源(除非使用 blob: URL),否则会被浏览器阻止。
  5. 资源释放:Worker 运行时会占用系统资源,使用完毕后应及时调用 停止() 释放。
  6. 错误处理:务必设置 置发生错误回调,否则 Worker 内部错误可能静默失败,难以调试。
  7. 加载顺序加载文件 是异步的,但消息发送可在加载后立即进行,Worker 会排队处理。
  8. 线程数量:浏览器对 Worker 数量有限制,不建议创建过多 Worker。
  9. 共享 Worker:若需多个页面共享同一个 Worker,可使用 共享后台任务(SharedWorker),本组件暂不支持。
  10. 调试技巧:Worker 脚本中的 console.log 会输出到浏览器控制台,可用于调试。

相关文档

  • 文档不可视类型组件_WS客户端 —— WebSocket 实时通信
  • 文档不可视类型组件_SSE —— 服务器推送事件
  • 文档前端(JavaScript)函数_数据操作类 —— 前端数据处理函数
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、JSON 操作等
  • 文档综合演示:大数据处理 —— 实际应用示例