欧美日韩精品一区二区在线线,一级无码在线收看,精品国产高清91,久久精品欧美电影

# 多線程 Worker

一些異步處理的任務(wù),可以放置于 Worker 中運(yùn)行,待運(yùn)行結(jié)束后,再把結(jié)果返回到小程序主線程。Worker 運(yùn)行于一個單獨(dú)的全局上下文與線程中,不能直接調(diào)用主線程的方法。

Worker 與主線程之間的數(shù)據(jù)傳輸,雙方使用 Worker.postMessage() 來發(fā)送數(shù)據(jù),Worker.onMessage() 來接收數(shù)據(jù),傳輸?shù)臄?shù)據(jù)并不是直接共享,而是被復(fù)制的。

# 使用流程

在開發(fā)者工具中預(yù)覽效果

# 1. 配置 Worker 信息

app.json 中可配置 Worker 代碼放置的目錄,目錄下的所有 JS 代碼最終將被打包成一個 JS 文件:

配置示例:

{
  "workers": "workers"
}

通過以上方式配置,workers 目錄下的所有 JS 文件會被打包為一個 JS 文件,并作為小程序首包的一部分。

小程序首包體積是有上限的(目前為2M),為了使 worker 代碼不占用首包體積,從基礎(chǔ)庫 v2.27.3 開始支持將 worker 代碼打包為一個分包。(需要更新開發(fā)者工具至最新 nightly 版本)

worker 代碼配置為分包示例:

{
  "workers": {
    "path": "workers",
    "isSubpackage": true  // true 表示把 worker 打包為分包。默認(rèn) false。填 false 時等同于 { "workers": "workers" }
  }
}

# 2. 添加 Worker 代碼文件

根據(jù)步驟 1 中的配置,在代碼目錄下新建以下兩個入口文件:

workers/request/index.js
workers/request/utils.js
workers/response/index.js

添加后,目錄結(jié)構(gòu)如下:

├── app.js
├── app.json
├── project.config.json
└── workers
    ├── request
    │   ├── index.js
    │   └── utils.js
    └── response
        └── index.js

# 3. 編寫 Worker 代碼

workers/request/index.js 編寫 Worker 響應(yīng)代碼

const utils = require('./utils')

// 在 Worker 線程執(zhí)行上下文會全局暴露一個 worker 對象,直接調(diào)用 worker.onMessage/postMessage 即可
worker.onMessage(function (res) {
  console.log(res)
})

# 4. 在主線程中初始化 Worker

在主線程的代碼 app.js 中初始化 Worker

const worker = wx.createWorker('workers/request/index.js') // 文件名指定 worker 的入口文件路徑,絕對路徑

從基礎(chǔ)庫 v2.27.3 開始,如果 worker 代碼配置為了分包,則需要先通過 wx.preDownloadSubpackage 接口下載好 worker 代碼,再初始化 Worker

var task = wx.preDownloadSubpackage({
   packageType: "workers", 
   success(res) {
      console.log("load worker success", res)
      var worker = wx.createWorker("workers/request/index.js")   // 創(chuàng)建 worker。 如果 worker 分包沒下載完就調(diào) createWorker 的話將報錯
   },
   fail(res) {
      console.log("load worker fail", res)
   }
})

task.onProgressUpdate(res => {
  console.log(res.progress) // 可通過 onProgressUpdate 接口監(jiān)聽下載進(jìn)度
  console.log(res.totalBytesWritten)
  console.log(res.totalBytesExpectedToWrite)
})

# 5. 主線程向 Worker 發(fā)送消息

worker.postMessage({
  msg: 'hello worker'
})

worker 對象的其它接口請看 worker接口說明

# 注意事項

  1. Worker 最大并發(fā)數(shù)量限制為 1 個,創(chuàng)建下一個前請用 Worker.terminate() 結(jié)束當(dāng)前 Worker
  2. Worker 內(nèi)代碼只能 require 指定 Worker 路徑內(nèi)的文件,無法引用其它路徑
  3. Worker 的入口文件由 wx.createWorker() 時指定,開發(fā)者可動態(tài)指定 Worker 入口文件
  4. Worker 內(nèi)不支持 wx 系列的 API
  5. Workers 之間不支持發(fā)送消息
  6. Worker 目錄內(nèi)只支持放置 JS 文件,其他類型的靜態(tài)文件需要放在 Worker 目錄外
  7. 基礎(chǔ)庫 v2.18.1 開始支持在插件內(nèi)使用 worker。相應(yīng)地,插件使用worker前需要在plugin.json內(nèi)配置workers代碼路徑,即一個相對插件代碼包根目錄的路徑。