基本介绍
有时候小程序文档真的看的我脑壳疼
多线程顾名思义,简单理解成正在执行我们业务代码的线程(主线程)之外,再开一个后台线程worker。一般用来执行一些耗时的任务和定时任务。
整体思路
1.全局开启worker
2.主线程引入对应worker,发送消息给后台线程,并监听返回信息
3.监听收到的信息,进行代码处理,发送信息给主线程。
具体步骤
- app.json第一级属性中添加worker: “workers”: “workers”
- 新建worker文件夹,
- 在主线程中,即自己页面代码编写整体思路的第二点
//引入并创建需要的线程
const worker = wx.createWorker('/worker/request/getUploadFiles')
//形式很类似h5的postmessage
worker.postMessage({
id:666
})
//监听结果
worker.onMessage((res)=>{
...拿到结果后一顿处理...
//销毁线程
Worker.terminate()
})
//监听worker被系统回收
Worker.onProcessKilled(()=> {
监听 worker线程被系统回收事件(当iOS系统资源紧张时,worker线程存在被系统回收的可能,开发者可监听此事件并重新创建一个worker)。仅限在主线程 worker 对象上调用
})
- 在后台线程中worker/request/index.js,编写整体思路的第三点
//微信帮你暴露了一个worker对象了。
//收到指令时执行
worker.onMessage( async (res)=>{
await (...一顿操作...)
worker.postMessage({
msg: 'hello worker'
})
})
注意事项
- Worker 最大并发数量限制为 1 个,创建下一个前请用 Worker.terminate() 结束当前 Worker
- Worker 内代码只能 require 指定 Worker 路径内的文件,无法引用其它路径
- Worker 的入口文件由 wx.createWorker() 时指定,开发者可动态指定 Worker 入口文件
- Worker 内不支持 wx 系列的 API
- Workers 之间不支持发送消息
- 线程销毁、线程回收监听只能在主线程操作