多進程Worker
一些非同步處理的任務,可以放置於Worker中運行,待運行結束後,再把結果返回到小程序主線程。 Worker運行於一個單獨的全域上下文與線程中,不能直接調用主線程的方法。
Worker與主線程之間的資料傳輸,雙方使用 Worker.postMessage() 來發送數據, Worker.onMessage() 來接收數據,傳輸的數據並不是直接共亯,而是被複製的。
使用流程
配置Worker資訊
在app.json中可配置Worker代碼放置的目錄,目錄下的所有JS代碼最終將被打包成一個JS文件:
配置示例:
js
{
"workers": "workers"
}通過以上管道配置,workers目錄下的所有JS文件會被打包為一個JS文件,並作為小程序首包的一部分。
添加Worker代碼文件
根據步驟1中的配置,在代碼目錄下新建以下兩個入口文件:
js
workers/request/index.js
workers/request/utils.js
workers/response/index.js添加後,目錄結構如下:
js
├── app.js
├── app.json
├── project.config.json
└── workers
├── request
│ ├── index.js
│ └── utils.js
└── response
└── index.js編寫Worker代碼
在workers/request/index.js編寫Worker響應代碼
js
const utils = require('./utils')
// In the worker thread execution context, a worker object is globally exposed and can be directly called by worker.onMessage/postMessage.
worker.onMessage(function (res) {
console.log(res)
})在主線程中初始化Worker
在主線程的代碼app.js中初始化Worker
js
const worker = wx.createWorker('workers/request/index.js') // The filename specifies the worker entry file path as an absolute path.主線程向Worker發送消息
js
worker.postMessage({
msg: 'hello worker'
})注意事項
- Worker最大併發數量限制為1個,創建下一個前請用 Worker.terminate() 結束當前Worker
- Worker內代碼只能require指定Worker路徑內的文件,無法引用其它路徑;
- Worker的入口文件由 wx.createWorker() 時指定,開發者可動態指定Worker入口文件;
- Worker內不支持wx系列的API;
- Workers之間不支持發送消息;
- Worker目錄內只支持放置JS文件,其他類型的靜態文件需要放在Worker目錄外。