组件:后台任务
后台任务组件是一个不可视组件,基于 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 更新 | 计算、解析、耗时操作 |
⚠️ 注意事项
- 脚本独立性:Worker 脚本是独立运行的,不能直接访问主线程的变量、函数或 DOM。所有数据交换需通过
发送消息和置收到消息回调实现。 - 数据拷贝:主线程与 Worker 之间的数据传递是值拷贝(而非引用传递),大数据量时会有性能开销。
- 浏览器支持:Web Worker 在现代浏览器中广泛支持,但 IE 等旧浏览器不支持。可通过
加载文件的返回值判断。 - 跨域限制:Worker 脚本需与页面同源(除非使用
blob:URL),否则会被浏览器阻止。 - 资源释放:Worker 运行时会占用系统资源,使用完毕后应及时调用
停止()释放。 - 错误处理:务必设置
置发生错误回调,否则 Worker 内部错误可能静默失败,难以调试。 - 加载顺序:
加载文件是异步的,但消息发送可在加载后立即进行,Worker 会排队处理。 - 线程数量:浏览器对 Worker 数量有限制,不建议创建过多 Worker。
- 共享 Worker:若需多个页面共享同一个 Worker,可使用
共享后台任务(SharedWorker),本组件暂不支持。 - 调试技巧:Worker 脚本中的
console.log会输出到浏览器控制台,可用于调试。
相关文档
- 文档
不可视类型组件_WS客户端—— WebSocket 实时通信 - 文档
不可视类型组件_SSE—— 服务器推送事件 - 文档
前端(JavaScript)函数_数据操作类—— 前端数据处理函数 - 文档
轻语言网站:轻语言语法速查—— 拉姆达表达式、JSON 操作等 - 文档
综合演示:大数据处理—— 实际应用示例