Worker是與主線程并行的獨(dú)立線程。創(chuàng)建Worker的線程稱(chēng)之為宿主線程,Worker自身的線程稱(chēng)之為Worker線程。創(chuàng)建Worker傳入的url文件在Worker線程中執(zhí)行,可以處理耗時(shí)操作但不可以直接操作UI。
Worker主要作用是為應(yīng)用程序提供一個(gè)多線程的運(yùn)行環(huán)境,可滿足應(yīng)用程序在執(zhí)行過(guò)程中與主線程分離,在后臺(tái)線程中運(yùn)行一個(gè)腳本操作耗時(shí)操作,極大避免類(lèi)似于計(jì)算密集型或高延遲的任務(wù)阻塞主線程的運(yùn)行。由于Worker一旦被創(chuàng)建則不會(huì)主動(dòng)被銷(xiāo)毀,若不處于任務(wù)狀態(tài)一直運(yùn)行,在一定程度上會(huì)造成資源的浪費(fèi),應(yīng)及時(shí)關(guān)閉空閑的Worker。
Worker的上下文對(duì)象和主線程的上下文對(duì)象是不同的,Worker線程不支持UI操作。
本模塊首批接口從API version 7 開(kāi)始支持。后續(xù)版本的新增接口,采用上角標(biāo)單獨(dú)標(biāo)記接口的起始版本。
系統(tǒng)能力: SystemCapability.Utils.Lang
名稱(chēng) | 類(lèi)型 | 可讀 | 可寫(xiě) | 說(shuō)明 |
---|---|---|---|---|
workerPort9+ | 是 | 是 | worker線程用于與宿主線程通信的對(duì)象。 | |
parentPort(deprecated) | 是 | 是 | worker線程用于與宿主線程通信的對(duì)象。 此屬性從API version 7開(kāi)始支持,從API version 9 開(kāi)始被廢棄。 建議使用workerPort9+替代。 |
Worker構(gòu)造函數(shù)的選項(xiàng)信息,用于為Worker添加其他信息。
系統(tǒng)能力: SystemCapability.Utils.Lang
名稱(chēng) | 類(lèi)型 | 只讀 | 必填 | 說(shuō)明 |
---|---|---|---|---|
type | "classic" | "module" | 是 | 否 | Worker執(zhí)行腳本的模式類(lèi)型,暫不支持module類(lèi)型,默認(rèn)值為"classic"。 |
name | string | 是 | 否 | Worker的名稱(chēng),默認(rèn)值為undefined。 |
shared | boolean | 是 | 否 | 表示W(wǎng)orker共享功能,此接口暫不支持。 |
constructor(scriptURL: string, options?: WorkerOptions)
ThreadWorker構(gòu)造函數(shù)。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
scriptURL | string | 是 | Worker執(zhí)行腳本的路徑。 在FA和Stage模型下,DevEco Studio新建Worker工程路徑分別存在以下兩種情況: (a) worker腳本所在目錄與pages目錄同級(jí)。 (b) worker腳本所在目錄與pages目錄不同級(jí)。 |
options | 否 | Worker構(gòu)造的選項(xiàng)。 |
返回值:
類(lèi)型 | 說(shuō)明 |
---|---|
ThreadWorker | 執(zhí)行ThreadWorker構(gòu)造函數(shù)生成的ThreadWorker對(duì)象,失敗則返回undefined。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200003 | Worker initialization failure. |
10200007 | The worker file patch is invalid path. |
示例:
- import worker from '@ohos.worker';
- // worker線程創(chuàng)建
- // FA模型-目錄同級(jí)(entry模塊下,workers目錄與pages目錄同級(jí))
- const workerFAModel01 = new worker.ThreadWorker("workers/worker.js", {name:"first worker in FA model"});
- // FA模型-目錄不同級(jí)(entry模塊下,workers目錄與pages目錄的父目錄同級(jí))
- const workerFAModel02 = new worker.ThreadWorker("../workers/worker.js");
- // Stage模型-目錄同級(jí)(entry模塊下,workers目錄與pages目錄同級(jí))
- const workerStageModel01 = new worker.ThreadWorker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
- // Stage模型-目錄不同級(jí)(entry模塊下,workers目錄是pages目錄的子目錄)
- const workerStageModel02 = new worker.ThreadWorker('entry/ets/pages/workers/worker.ts');
- // 理解Stage模型scriptURL的"entry/ets/workers/worker.ts":
- // entry: 為module.json5文件中module的name屬性對(duì)應(yīng)的值,ets: 表明當(dāng)前使用的語(yǔ)言。
- // scriptURL與worker文件所在的workers目錄層級(jí)有關(guān),與new worker所在文件無(wú)關(guān)。
- // Stage模型工程esmodule編譯場(chǎng)景下,支持新增的scriptURL規(guī)格:@bundle:bundlename/entryname/ets/workerdir/workerfile
- // @bundle:為固定標(biāo)簽,bundlename為當(dāng)前應(yīng)用包名,entryname為當(dāng)前模塊名,ets為當(dāng)前使用語(yǔ)言
- // workerdir為worker文件所在目錄,workerfile為worker文件名
- // Stage模型-目錄同級(jí)(entry模塊下,workers目錄與pages目錄同級(jí)),假設(shè)bundlename是com.example.workerdemo
- const workerStageModel03 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/workers/worker');
- // Stage模型-目錄不同級(jí)(entry模塊下,workers目錄是pages目錄的子目錄),假設(shè)bundlename是com.example.workerdemo
- const workerStageModel04 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/pages/workers/worker');
同時(shí),需在工程的模塊級(jí)build-profile.json5文件的buildOption屬性中添加配置信息,主要分為下面兩種情況:
(1) 目錄同級(jí)
FA模型:
- "buildOption": {
- "sourceOption": {
- "workers": [
- "./src/main/ets/MainAbility/workers/worker.ts"
- ]
- }
- }
Stage模型:
- "buildOption": {
- "sourceOption": {
- "workers": [
- "./src/main/ets/workers/worker.ts"
- ]
- }
- }
(2) 目錄不同級(jí)
FA模型:
- "buildOption": {
- "sourceOption": {
- "workers": [
- "./src/main/ets/workers/worker.ts"
- ]
- }
- }
Stage模型:
- "buildOption": {
- "sourceOption": {
- "workers": [
- "./src/main/ets/pages/workers/worker.ts"
- ]
- }
- }
postMessage(message: Object, transfer: ArrayBuffer[]): void
宿主線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)的方式向Worker線程發(fā)送消息。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
message | Object | 是 | 發(fā)送至Worker的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。 |
transfer | ArrayBuffer[] | 是 | 表示可轉(zhuǎn)移的ArrayBuffer實(shí)例對(duì)象數(shù)組,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到Worker線程,在宿主線程中將會(huì)變?yōu)椴豢捎?,僅在Worker線程中可用,數(shù)組不可傳入null。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200006 | Serializing an uncaught exception failed. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- var buffer = new ArrayBuffer(8);
- workerInstance.postMessage(buffer, [buffer]);
postMessage(message: Object, options?: PostMessageOptions): void
宿主線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)或者拷貝數(shù)據(jù)的方式向Worker線程發(fā)送消息。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
message | Object | 是 | 發(fā)送至Worker的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。 |
options | 否 | 當(dāng)填入該參數(shù)時(shí),與傳入ArrayBuffer[]的作用一致,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到Worker線程,在宿主線程中將會(huì)變?yōu)椴豢捎茫瑑H在Worker線程中可用。若不填入該參數(shù),默認(rèn)設(shè)置為 undefined,通過(guò)拷貝數(shù)據(jù)的方式傳輸信息到Worker線程。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200006 | Serializing an uncaught exception failed. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.postMessage("hello world");
- var buffer = new ArrayBuffer(8);
- workerInstance.postMessage(buffer, [buffer]);
on(type: string, listener: WorkerEventListener): void
向Worker添加一個(gè)事件監(jiān)聽(tīng),該接口與addEventListener9+接口功能一致。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 監(jiān)聽(tīng)的事件類(lèi)型。 |
listener | 是 | 回調(diào)的事件?;卣{(diào)事件。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.on("alert", (e)=>{
- console.log("alert listener callback");
- })
once(type: string, listener: WorkerEventListener): void
向Worker添加一個(gè)事件監(jiān)聽(tīng),事件監(jiān)聽(tīng)只執(zhí)行一次便自動(dòng)刪除。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 監(jiān)聽(tīng)的事件類(lèi)型。 |
listener | 是 | 回調(diào)的事件?;卣{(diào)事件。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.once("alert", (e)=>{
- console.log("alert listener callback");
- })
off(type: string, listener?: WorkerEventListener): void
刪除類(lèi)型為type的事件監(jiān)聽(tīng),該接口與removeEventListener9+接口功能一致。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 需要?jiǎng)h除的事件類(lèi)型。 |
listener | 否 | 回調(diào)的事件。刪除的回調(diào)事件。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- //使用on接口、once接口或addEventListener接口創(chuàng)建“alert”事件,使用off接口刪除事件。
- workerInstance.off("alert");
terminate(): void
銷(xiāo)毀Worker線程,終止Worker接收消息。
系統(tǒng)能力: SystemCapability.Utils.Lang
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.terminate();
onexit?: (code: number) => void
Worker對(duì)象的onexit屬性表示W(wǎng)orker銷(xiāo)毀時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
code | number | 是 | Worker退出的code。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.onexit = function(e) {
- console.log("onexit");
- }
- // onexit被執(zhí)行兩種方式:
- // 主線程:
- workerInstance.terminate();
- // worker線程:
- // workerPort.close()
onerror?: (err: ErrorEvent) => void
Worker對(duì)象的onerror屬性表示W(wǎng)orker在執(zhí)行過(guò)程中發(fā)生異常被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
err | 是 | 異常數(shù)據(jù)。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.onerror = function(e) {
- console.log("onerror");
- }
onmessage?: (event: MessageEvents) => void
Worker對(duì)象的onmessage屬性表示宿主線程接收到來(lái)自其創(chuàng)建的Worker通過(guò)workerPort.postMessage接口發(fā)送的消息時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
event | 是 | 收到的Worker消息數(shù)據(jù)。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.onmessage = function(e) {
- // e : MessageEvents, 用法如下:
- // let data = e.data;
- console.log("onmessage");
- }
onmessageerror?: (event: MessageEvents) => void
Worker對(duì)象的onmessageerror屬性表示當(dāng)Worker對(duì)象接收到一條無(wú)法被序列化的消息時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
event | 是 | 異常數(shù)據(jù)。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.onmessageerror= function(e) {
- console.log("onmessageerror");
- }
addEventListener(type: string, listener: WorkerEventListener): void
向Worker添加一個(gè)事件監(jiān)聽(tīng),該接口與on9+接口功能一致。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 監(jiān)聽(tīng)的事件類(lèi)型。 |
listener | 是 | 回調(diào)的事件。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.addEventListener("alert", (e)=>{
- console.log("alert listener callback");
- })
removeEventListener(type: string, callback?: WorkerEventListener): void
刪除Worker的事件監(jiān)聽(tīng),該接口與off9+接口功能一致。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 需要?jiǎng)h除的監(jiān)聽(tīng)事件類(lèi)型。 |
callback | 否 | 回調(diào)的事件。刪除的回調(diào)事件。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.addEventListener("alert", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.removeEventListener("alert");
dispatchEvent(event: Event): boolean
分發(fā)定義在Worker的事件。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
event | 是 | 需要分發(fā)的事件。 |
返回值:
類(lèi)型 | 說(shuō)明 |
---|---|
boolean | 分發(fā)的結(jié)果,false表示分發(fā)失敗。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暫未支持。
分發(fā)事件(dispatchEvent)可與監(jiān)聽(tīng)接口(on、once、addEventListener)搭配使用,示例如下:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- //用法一:
- workerInstance.on("alert_on", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.once("alert_once", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.addEventListener("alert_add", (e)=>{
- console.log("alert listener callback");
- })
- //once接口創(chuàng)建的事件執(zhí)行一次便會(huì)刪除。
- workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暫未支持。
- //on接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
- workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
- workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
- //addEventListener接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
- workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
- workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
- //用法二:
- //event類(lèi)型的type支持自定義,同時(shí)存在"message"/"messageerror"/"error"特殊類(lèi)型,如下所示
- //當(dāng)type = "message",onmessage接口定義的方法同時(shí)會(huì)執(zhí)行。
- //當(dāng)type = "messageerror",onmessageerror接口定義的方法同時(shí)會(huì)執(zhí)行。
- //當(dāng)type = "error",onerror接口定義的方法同時(shí)會(huì)執(zhí)行。
- //若調(diào)用removeEventListener接口或者off接口取消事件時(shí),能且只能取消使用addEventListener/on/once創(chuàng)建的事件。
- workerInstance.addEventListener("message", (e)=>{
- console.log("message listener callback");
- })
- workerInstance.onmessage = function(e) {
- console.log("onmessage : message listener callback");
- }
- //調(diào)用dispatchEvent分發(fā)“message”事件,addEventListener和onmessage中定義的方法都會(huì)被執(zhí)行。
- workerInstance.dispatchEvent({type:"message", timeStamp:0});
removeAllListener(): void
刪除Worker所有的事件監(jiān)聽(tīng)。
系統(tǒng)能力: SystemCapability.Utils.Lang
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.addEventListener("alert", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.removeAllListener();
addEventListener(type: string, listener: WorkerEventListener): void
向Worker添加一個(gè)事件監(jiān)聽(tīng),該接口與on9+接口功能一致。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 監(jiān)聽(tīng)的事件類(lèi)型。 |
listener | 是 | 回調(diào)的事件。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.addEventListener("alert", (e)=>{
- console.log("alert listener callback");
- })
removeEventListener(type: string, callback?: WorkerEventListener): void
刪除Worker的事件監(jiān)聽(tīng),該接口與off9+接口功能一致。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 需要?jiǎng)h除的監(jiān)聽(tīng)事件類(lèi)型。 |
callback | 否 | 回調(diào)的事件。刪除的回調(diào)事件。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.addEventListener("alert", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.removeEventListener("alert");
dispatchEvent(event: Event): boolean
分發(fā)定義在Worker的事件。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
event | 是 | 需要分發(fā)的事件。 |
返回值:
類(lèi)型 | 說(shuō)明 |
---|---|
boolean | 分發(fā)的結(jié)果,false表示分發(fā)失敗。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暫未支持。
分發(fā)事件(dispatchEvent)可與監(jiān)聽(tīng)接口(on、once、addEventListener)搭配使用,示例如下:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- //用法一:
- workerInstance.on("alert_on", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.once("alert_once", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.addEventListener("alert_add", (e)=>{
- console.log("alert listener callback");
- })
- //once接口創(chuàng)建的事件執(zhí)行一次便會(huì)刪除。
- workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暫未支持。
- //on接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
- workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
- workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
- //addEventListener接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
- workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
- workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
- //用法二:
- //event類(lèi)型的type支持自定義,同時(shí)存在"message"/"messageerror"/"error"特殊類(lèi)型,如下所示
- //當(dāng)type = "message",onmessage接口定義的方法同時(shí)會(huì)執(zhí)行。
- //當(dāng)type = "messageerror",onmessageerror接口定義的方法同時(shí)會(huì)執(zhí)行。
- //當(dāng)type = "error",onerror接口定義的方法同時(shí)會(huì)執(zhí)行。
- //若調(diào)用removeEventListener接口或者off接口取消事件時(shí),能且只能取消使用addEventListener/on/once創(chuàng)建的事件。
- workerInstance.addEventListener("message", (e)=>{
- console.log("message listener callback");
- })
- workerInstance.onmessage = function(e) {
- console.log("onmessage : message listener callback");
- }
- //調(diào)用dispatchEvent分發(fā)“message”事件,addEventListener和onmessage中定義的方法都會(huì)被執(zhí)行。
- workerInstance.dispatchEvent({type:"message", timeStamp:0});
removeAllListener(): void
刪除Worker所有的事件監(jiān)聽(tīng)。
系統(tǒng)能力: SystemCapability.Utils.Lang
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.addEventListener("alert", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.removeAllListener();
Worker線程用于與宿主線程通信的類(lèi),通過(guò)postMessage接口發(fā)送消息給宿主線程、close接口銷(xiāo)毀Worker線程。ThreadWorkerGlobalScope類(lèi)繼承GlobalScope9+。
postMessage(messageObject: Object, transfer: ArrayBuffer[]): void
Worker線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)的方式向宿主線程發(fā)送消息。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
message | Object | 是 | 發(fā)送至宿主線程的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。 |
transfer | ArrayBuffer[] | 是 | 表示可轉(zhuǎn)移的ArrayBuffer實(shí)例對(duì)象數(shù)組,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到宿主線程,在Worker線程中將會(huì)變?yōu)椴豢捎?,僅在宿主線程中可用,數(shù)組不可傳入null。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200006 | Serializing an uncaught exception failed. |
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.postMessage("hello world");
- workerInstance.onmessage = function(e) {
- // let data = e.data;
- console.log("receive data from worker.js");
- }
- // worker.ts
- import worker from '@ohos.worker';
- const workerPort = worker.workerPort;
- workerPort.onmessage = function(e){
- // let data = e.data;
- var buffer = new ArrayBuffer(8);
- workerPort.postMessage(buffer, [buffer]);
- }
postMessage(messageObject: Object, options?: PostMessageOptions): void
Worker線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)或者拷貝數(shù)據(jù)的方式向宿主線程發(fā)送消息。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
message | Object | 是 | 發(fā)送至宿主線程的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。 |
options | 否 | 當(dāng)填入該參數(shù)時(shí),與傳入ArrayBuffer[]的作用一致,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到宿主線程,在Worker線程中將會(huì)變?yōu)椴豢捎茫瑑H在宿主線程中可用。若不填入該參數(shù),默認(rèn)設(shè)置為 undefined,通過(guò)拷貝數(shù)據(jù)的方式傳輸信息到宿主線程。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200006 | Serializing an uncaught exception failed. |
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.postMessage("hello world");
- workerInstance.onmessage = function(e) {
- // let data = e.data;
- console.log("receive data from worker.js");
- }
- // worker.ts
- import worker from '@ohos.worker';
- const workerPort = worker.workerPort;
- workerPort.onmessage = function(e){
- // let data = e.data;
- workerPort.postMessage("receive data from main.js");
- }
close(): void
銷(xiāo)毀Worker線程,終止Worker接收消息。
系統(tǒng)能力: SystemCapability.Utils.Lang
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- // worker.ts
- import worker from '@ohos.worker';
- const workerPort = worker.workerPort;
- workerPort.onmessage = function(e) {
- workerPort.close()
- }
onmessage?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) => void
ThreadWorkerGlobalScope的onmessage屬性表示W(wǎng)orker線程收到來(lái)自其宿主線程通過(guò)postMessage接口發(fā)送的消息時(shí)被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
this | 是 | 指向調(diào)用者對(duì)象。 | |
ev | 是 | 收到宿主線程發(fā)送的數(shù)據(jù)。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.postMessage("hello world");
- // worker.ts
- import worker from '@ohos.worker';
- const workerPort = worker.workerPort;
- workerPort.onmessage = function(e) {
- console.log("receive main.js message");
- }
onmessageerror?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) => void
ThreadWorkerGlobalScope的onmessageerror屬性表示當(dāng)Worker對(duì)象接收到一條無(wú)法被反序列化的消息時(shí)被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
this | 是 | 指向調(diào)用者對(duì)象。 | |
ev | 是 | 異常數(shù)據(jù)。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- // worker.ts
- import worker from '@ohos.worker';
- const workerPort = worker.workerPort;
- workerPort.onmessageerror = function(e) {
- console.log("worker.js onmessageerror")
- }
(event: Event): void | Promise<void>
事件監(jiān)聽(tīng)類(lèi)。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
event | 是 | 回調(diào)的事件類(lèi)。 |
返回值:
類(lèi)型 | 說(shuō)明 |
---|---|
void | Promise<void> | 無(wú)返回值或者以Promise形式返回。 |
錯(cuò)誤碼:
以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。
錯(cuò)誤碼ID | 錯(cuò)誤信息 |
---|---|
10200004 | Worker instance is not running. |
10200005 | The invoked API is not supported in workers. |
示例:
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
- workerInstance.addEventListener("alert", (e)=>{
- console.log("alert listener callback");
- })
系統(tǒng)能力: SystemCapability.Utils.Lang
名稱(chēng) | 類(lèi)型 | 可讀 | 可寫(xiě) | 說(shuō)明 |
---|---|---|---|---|
name | string | 是 | 否 | Worker的名字,new Worker時(shí)指定。 |
self | GlobalScope & typeof globalThis | 是 | 否 | GlobalScope本身。 |
onerror?: (ev: ErrorEvent) => void
GlobalScope的onerror屬性表示W(wǎng)orker在執(zhí)行過(guò)程中發(fā)生異常被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
ev | 是 | 異常數(shù)據(jù)。 |
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts")
- // worker.ts
- import worker from '@ohos.worker';
- const workerPort = worker.workerPort
- workerPort.onerror = function(e){
- console.log("worker.js onerror")
- }
消息類(lèi),持有Worker線程間傳遞的數(shù)據(jù)。
系統(tǒng)能力: SystemCapability.Utils.Lang
名稱(chēng) | 類(lèi)型 | 可讀 | 可寫(xiě) | 說(shuō)明 |
---|---|---|---|---|
data | any | 是 | 否 | 線程間傳遞的數(shù)據(jù)。 |
使用以下方法前,均需先構(gòu)造Worker實(shí)例,Worker類(lèi)繼承EventTarget。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker9+替代。
constructor(scriptURL: string, options?: WorkerOptions)
Worker構(gòu)造函數(shù)。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.constructor9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
scriptURL | string | 是 | Worker執(zhí)行腳本的路徑。 在FA和Stage模型下,DevEco Studio新建Worker工程路徑分別存在以下兩種情況: (a) worker腳本所在目錄與pages目錄同級(jí)。 (b) worker腳本所在目錄與pages目錄不同級(jí)。 |
options | 否 | Worker構(gòu)造的選項(xiàng)。 |
返回值:
類(lèi)型 | 說(shuō)明 |
---|---|
Worker | 執(zhí)行Worker構(gòu)造函數(shù)生成的Worker對(duì)象,失敗則返回undefined。 |
示例:
- import worker from '@ohos.worker';
- // worker線程創(chuàng)建
- // FA模型-目錄同級(jí)
- const workerFAModel01 = new worker.Worker("workers/worker.js", {name:"first worker in FA model"});
- // FA模型-目錄不同級(jí)(以workers目錄放置pages目錄前一級(jí)為例)
- const workerFAModel02 = new worker.Worker("../workers/worker.js");
- // Stage模型-目錄同級(jí)
- const workerStageModel01 = new worker.Worker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
- // Stage模型-目錄不同級(jí)(以workers目錄放置pages目錄后一級(jí)為例)
- const workerStageModel02 = new worker.Worker('entry/ets/pages/workers/worker.ts');
- // 理解Stage模型scriptURL的"entry/ets/workers/worker.ts":
- // entry: 為module.json5文件中module的name屬性對(duì)應(yīng)的值;
- // ets: 表明當(dāng)前使用的語(yǔ)言。
同時(shí),需在工程的模塊級(jí)build-profile.json5文件的buildOption屬性中添加配置信息,主要分為下面兩種情況:
(1) 目錄同級(jí)
FA模型:
- "buildOption": {
- "sourceOption": {
- "workers": [
- "./src/main/ets/MainAbility/workers/worker.ts"
- ]
- }
- }
Stage模型:
- "buildOption": {
- "sourceOption": {
- "workers": [
- "./src/main/ets/workers/worker.ts"
- ]
- }
- }
(2) 目錄不同級(jí)
FA模型:
- "buildOption": {
- "sourceOption": {
- "workers": [
- "./src/main/ets/workers/worker.ts"
- ]
- }
- }
Stage模型:
- "buildOption": {
- "sourceOption": {
- "workers": [
- "./src/main/ets/pages/workers/worker.ts"
- ]
- }
- }
postMessage(message: Object, transfer: ArrayBuffer[]): void
宿主線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)的方式向Worker線程發(fā)送消息。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.postMessage9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
message | Object | 是 | 發(fā)送至Worker的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。 |
transfer | ArrayBuffer[] | 是 | 表示可轉(zhuǎn)移的ArrayBuffer實(shí)例對(duì)象數(shù)組,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到Worker線程,在宿主線程中將會(huì)變?yōu)椴豢捎?,僅在Worker線程中可用,數(shù)組不可傳入null。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- var buffer = new ArrayBuffer(8);
- workerInstance.postMessage(buffer, [buffer]);
postMessage(message: Object, options?: PostMessageOptions): void
宿主線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)或者拷貝數(shù)據(jù)的方式向Worker線程發(fā)送消息。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.postMessage9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
message | Object | 是 | 發(fā)送至Worker的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。 |
options | 否 | 當(dāng)填入該參數(shù)時(shí),與傳入ArrayBuffer[]的作用一致,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到Worker線程,在宿主線程中將會(huì)變?yōu)椴豢捎?,僅在Worker線程中可用。若不填入該參數(shù),默認(rèn)設(shè)置為 undefined,通過(guò)拷貝數(shù)據(jù)的方式傳輸信息到Worker線程。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.postMessage("hello world");
- var buffer = new ArrayBuffer(8);
- workerInstance.postMessage(buffer, [buffer]);
on(type: string, listener: EventListener): void
向Worker添加一個(gè)事件監(jiān)聽(tīng),該接口與addEventListener(deprecated)接口功能一致。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.on9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 監(jiān)聽(tīng)的事件類(lèi)型。 |
listener | 是 | 回調(diào)事件。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.on("alert", (e)=>{
- console.log("alert listener callback");
- })
once(type: string, listener: EventListener): void
向Worker添加一個(gè)事件監(jiān)聽(tīng),事件監(jiān)聽(tīng)只執(zhí)行一次便自動(dòng)刪除。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.once9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 監(jiān)聽(tīng)的事件類(lèi)型。 |
listener | 是 | 回調(diào)事件。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.once("alert", (e)=>{
- console.log("alert listener callback");
- })
off(type: string, listener?: EventListener): void
刪除類(lèi)型為type的事件監(jiān)聽(tīng),該接口與removeEventListener(deprecated)接口功能一致。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.off9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 需要?jiǎng)h除的事件類(lèi)型。 |
listener | 否 | 刪除的回調(diào)事件。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- //使用on接口、once接口或addEventListener接口創(chuàng)建“alert”事件,使用off接口刪除事件。
- workerInstance.off("alert");
terminate(): void
銷(xiāo)毀Worker線程,終止Worker接收消息。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.terminate9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.terminate();
onexit?: (code: number) => void
Worker對(duì)象的onexit屬性表示W(wǎng)orker銷(xiāo)毀時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.onexit9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
code | number | 是 | Worker退出的code。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.onexit = function(e) {
- console.log("onexit");
- }
- //onexit被執(zhí)行兩種方式:
- //主線程:
- workerInstance.terminate();
- //worker線程:
- //parentPort.close()
onerror?: (err: ErrorEvent) => void
Worker對(duì)象的onerror屬性表示W(wǎng)orker在執(zhí)行過(guò)程中發(fā)生異常被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.onerror9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
err | 是 | 異常數(shù)據(jù)。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.onerror = function(e) {
- console.log("onerror");
- }
onmessage?: (event: MessageEvent) => void
Worker對(duì)象的onmessage屬性表示宿主線程接收到來(lái)自其創(chuàng)建的Worker通過(guò)parentPort.postMessage接口發(fā)送的消息時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.onmessage9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
event | 是 | 收到的Worker消息數(shù)據(jù)。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.onmessage = function(e) {
- // e : MessageEvent, 用法如下:
- // let data = e.data;
- console.log("onmessage");
- }
onmessageerror?: (event: MessageEvent) => void
Worker對(duì)象的onmessageerror屬性表示當(dāng)Worker對(duì)象接收到一條無(wú)法被序列化的消息時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.onmessageerror9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
event | 是 | 異常數(shù)據(jù)。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.onmessageerror= function(e) {
- console.log("onmessageerror");
- }
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用WorkerEventTarget9+替代。
addEventListener(type: string, listener: EventListener): void
向Worker添加一個(gè)事件監(jiān)聽(tīng),該接口與on(deprecated)接口功能一致。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用addEventListener9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 監(jiān)聽(tīng)的事件類(lèi)型。 |
listener | 是 | 回調(diào)的事件。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.addEventListener("alert", (e)=>{
- console.log("alert listener callback");
- })
removeEventListener(type: string, callback?: EventListener): void
刪除Worker的事件監(jiān)聽(tīng),該接口與off(deprecated)接口功能一致。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用removeEventListener9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
type | string | 是 | 需要?jiǎng)h除的監(jiān)聽(tīng)事件類(lèi)型。 |
callback | 否 | 刪除的回調(diào)事件。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.addEventListener("alert", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.removeEventListener("alert");
dispatchEvent(event: Event): boolean
分發(fā)定義在Worker的事件。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用dispatchEvent9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
event | 是 | 需要分發(fā)的事件。 |
返回值:
類(lèi)型 | 說(shuō)明 |
---|---|
boolean | 分發(fā)的結(jié)果,false表示分發(fā)失敗。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暫未支持。
分發(fā)事件(dispatchEvent)可與監(jiān)聽(tīng)接口(on、once、addEventListener)搭配使用,示例如下:
- const workerInstance = new worker.Worker("workers/worker.js");
- //用法一:
- workerInstance.on("alert_on", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.once("alert_once", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.addEventListener("alert_add", (e)=>{
- console.log("alert listener callback");
- })
- //once接口創(chuàng)建的事件執(zhí)行一次便會(huì)刪除。
- workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暫未支持。
- //on接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
- workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
- workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
- //addEventListener接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
- workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
- workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
- //用法二:
- //event類(lèi)型的type支持自定義,同時(shí)存在"message"/"messageerror"/"error"特殊類(lèi)型,如下所示
- //當(dāng)type = "message",onmessage接口定義的方法同時(shí)會(huì)執(zhí)行。
- //當(dāng)type = "messageerror",onmessageerror接口定義的方法同時(shí)會(huì)執(zhí)行。
- //當(dāng)type = "error",onerror接口定義的方法同時(shí)會(huì)執(zhí)行。
- //若調(diào)用removeEventListener接口或者off接口取消事件時(shí),能且只能取消使用addEventListener/on/once創(chuàng)建的事件。
- workerInstance.addEventListener("message", (e)=>{
- console.log("message listener callback");
- })
- workerInstance.onmessage = function(e) {
- console.log("onmessage : message listener callback");
- }
- //調(diào)用dispatchEvent分發(fā)“message”事件,addEventListener和onmessage中定義的方法都會(huì)被執(zhí)行。
- workerInstance.dispatchEvent({type:"message", timeStamp:0});
removeAllListener(): void
刪除Worker所有的事件監(jiān)聽(tīng)。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用removeAllListener9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.addEventListener("alert", (e)=>{
- console.log("alert listener callback");
- })
- workerInstance.removeAllListener();
Worker線程用于與宿主線程通信的類(lèi),通過(guò)postMessage接口發(fā)送消息給宿主線程、close接口銷(xiāo)毀Worker線程。DedicatedWorkerGlobalScope類(lèi)繼承WorkerGlobalScope。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope9+替代。
postMessage(messageObject: Object, transfer: ArrayBuffer[]): void
Worker線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)的方式向宿主線程發(fā)送消息。
DedicatedWorkerGlobalScope類(lèi)自API version 9 開(kāi)始廢棄,本接口建議使用ThreadWorkerGlobalScope.postMessage替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
message | Object | 是 | 發(fā)送至宿主線程的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。 |
transfer | ArrayBuffer[] | 是 | 表示可轉(zhuǎn)移的ArrayBuffer實(shí)例對(duì)象數(shù)組,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到宿主線程,在Worker線程中將會(huì)變?yōu)椴豢捎茫瑑H在宿主線程中可用,數(shù)組不可傳入null。 |
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.postMessage("hello world");
- workerInstance.onmessage = function(e) {
- // let data = e.data;
- console.log("receive data from worker.js");
- }
- // worker.js
- import worker from '@ohos.worker';
- const workerPort = worker.workerPort;
- workerPort.onmessage = function(e){
- // let data = e.data;
- let buffer = new ArrayBuffer(5)
- workerPort.postMessage(buffer, [buffer]);
- }
postMessage(messageObject: Object, transfer: Transferable[]): void
Worker線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)的方式向宿主線程發(fā)送消息。
此接口暫不支持使用,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope.postMessage替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
messageObject | Object | 是 | 發(fā)送至宿主線程的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。 |
options | Transferable[] | 否 | 暫不支持該參數(shù)類(lèi)型。 |
postMessage(messageObject: Object, options?: PostMessageOptions): void
Worker線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)或者拷貝數(shù)據(jù)的方式向宿主線程發(fā)送消息。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope.postMessage替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
message | Object | 是 | 發(fā)送至宿主線程的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。 |
options | 否 | 當(dāng)填入該參數(shù)時(shí),與傳入ArrayBuffer[]的作用一致,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到宿主線程,在Worker線程中將會(huì)變?yōu)椴豢捎?,僅在宿主線程中可用。若不填入該參數(shù),默認(rèn)設(shè)置為 undefined,通過(guò)拷貝數(shù)據(jù)的方式傳輸信息到宿主線程。 |
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.postMessage("hello world");
- workerInstance.onmessage = function(e) {
- // let data = e.data;
- console.log("receive data from worker.js");
- }
- // worker.js
- import worker from '@ohos.worker';
- const parentPort = worker.parentPort;
- parentPort.onmessage = function(e){
- // let data = e.data;
- parentPort.postMessage("receive data from main.js");
- }
close(): void
銷(xiāo)毀Worker線程,終止Worker接收消息。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope.close替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.Worker("workers/worker.js");
- // worker.js
- import worker from '@ohos.worker';
- const parentPort = worker.parentPort;
- parentPort.onmessage = function(e) {
- parentPort.close()
- }
onmessage?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) => void
DedicatedWorkerGlobalScope的onmessage屬性表示W(wǎng)orker線程收到來(lái)自其宿主線程通過(guò)postMessage接口發(fā)送的消息時(shí)被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope.onmessage替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
this | 是 | 指向調(diào)用者對(duì)象。 | |
ev | 是 | 收到宿主線程發(fā)送的數(shù)據(jù)。 |
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.postMessage("hello world");
- // worker.js
- import worker from '@ohos.worker';
- const parentPort = worker.parentPort;
- parentPort.onmessage = function(e) {
- console.log("receive main.js message");
- }
onmessageerror?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) => void
DedicatedWorkerGlobalScope的onmessageerror屬性表示當(dāng)Worker對(duì)象接收到一條無(wú)法被反序列化的消息時(shí)被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope.onmessageerror替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
this | 是 | 指向調(diào)用者對(duì)象。 | |
ev | 是 | 異常數(shù)據(jù)。 |
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.Worker("workers/worker.js");
- // worker.js
- import worker from '@ohos.worker';
- const parentPort = worker.parentPort;
- parentPort.onmessageerror = function(e) {
- console.log("worker.js onmessageerror")
- }
明確數(shù)據(jù)傳遞過(guò)程中需要轉(zhuǎn)移所有權(quán)對(duì)象的類(lèi),傳遞所有權(quán)的對(duì)象必須是ArrayBuffer,發(fā)送它的上下文中將會(huì)變?yōu)椴豢捎?,僅在接收方可用。
系統(tǒng)能力: SystemCapability.Utils.Lang
名稱(chēng) | 類(lèi)型 | 可讀 | 可寫(xiě) | 說(shuō)明 |
---|---|---|---|---|
transfer | Object[] | 是 | 是 | ArrayBuffer數(shù)組,用于傳遞所有權(quán)。該數(shù)組中不可傳入null。 |
事件類(lèi)。
系統(tǒng)能力: SystemCapability.Utils.Lang
名稱(chēng) | 類(lèi)型 | 可讀 | 可寫(xiě) | 說(shuō)明 |
---|---|---|---|---|
type | string | 是 | 否 | 指定事件的類(lèi)型。 |
timeStamp | number | 是 | 否 | 事件創(chuàng)建時(shí)的時(shí)間戳(精度為毫秒),暫未支持。 |
(evt: Event): void | Promise<void>
事件監(jiān)聽(tīng)類(lèi)。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用WorkerEventListener9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
evt | 是 | 回調(diào)的事件類(lèi)。 |
返回值:
類(lèi)型 | 說(shuō)明 |
---|---|
void | Promise<void> | 無(wú)返回值或者以Promise形式返回。 |
示例:
- const workerInstance = new worker.Worker("workers/worker.js");
- workerInstance.addEventListener("alert", (e)=>{
- console.log("alert listener callback");
- })
錯(cuò)誤事件類(lèi),用于表示W(wǎng)orker執(zhí)行過(guò)程中出現(xiàn)異常的詳細(xì)信息,ErrorEvent類(lèi)繼承Event。
系統(tǒng)能力: SystemCapability.Utils.Lang
名稱(chēng) | 類(lèi)型 | 可讀 | 可寫(xiě) | 說(shuō)明 |
---|---|---|---|---|
message | string | 是 | 否 | 異常發(fā)生的錯(cuò)誤信息。 |
filename | string | 是 | 否 | 出現(xiàn)異常所在的文件。 |
lineno | number | 是 | 否 | 異常所在的行數(shù)。 |
colno | number | 是 | 否 | 異常所在的列數(shù)。 |
error | Object | 是 | 否 | 異常類(lèi)型。 |
消息類(lèi),持有Worker線程間傳遞的數(shù)據(jù)。
系統(tǒng)能力: SystemCapability.Utils.Lang
名稱(chēng) | 類(lèi)型 | 可讀 | 可寫(xiě) | 說(shuō)明 |
---|---|---|---|---|
data | T | 是 | 否 | 線程間傳遞的數(shù)據(jù)。 |
Worker線程自身的運(yùn)行環(huán)境,WorkerGlobalScope類(lèi)繼承EventTarget。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用GlobalScope9+替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
名稱(chēng) | 類(lèi)型 | 可讀 | 可寫(xiě) | 說(shuō)明 |
---|---|---|---|---|
name | string | 是 | 否 | Worker的名字,new Worker時(shí)指定。 |
self | WorkerGlobalScope & typeof globalThis | 是 | 否 | WorkerGlobalScope本身。 |
onerror?: (ev: ErrorEvent) => void
WorkerGlobalScope的onerror屬性表示W(wǎng)orker在執(zhí)行過(guò)程中發(fā)生異常被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。
從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用GlobalScope.onerror替代。
系統(tǒng)能力: SystemCapability.Utils.Lang
參數(shù):
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
ev | 是 | 異常數(shù)據(jù)。 |
示例:
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.Worker("workers/worker.js")
- // worker.js
- import worker from '@ohos.worker';
- const parentPort = worker.parentPort
- parentPort.onerror = function(e){
- console.log("worker.js onerror")
- }
Type | 備注 | 是否支持 |
---|---|---|
All Primitive Type | 不包括symbol | 是 |
Date | 是 | |
String | 是 | |
RegExp | 是 | |
Array | 是 | |
Map | 是 | |
Set | 是 | |
Object | 只支持Plain Object,不支持帶function的 | 是 |
ArrayBuffer | 提供transfer能力 | 是 |
TypedArray | 是 |
特例:傳遞通過(guò)自定義class創(chuàng)建出來(lái)的object時(shí),不會(huì)發(fā)生序列化錯(cuò)誤,但是自定義class的屬性(如Function)無(wú)法通過(guò)序列化傳遞。
以API version 9的FA工程為例。
- // main.js
- import worker from '@ohos.worker';
- const workerInstance = new worker.ThreadWorker("workers/worker.js");
- workerInstance.postMessage("message from main to worker");
- workerInstance.onmessage = function(d) {
- // 當(dāng)worker線程傳遞obj2時(shí),data即為obj2。data沒(méi)有Init、SetName的方法
- let data = d.data;
- }
- // worker.js
- import worker from '@ohos.worker';
- const workerPort = worker.workerPort;
- class MyModel {
- name = "undefined"
- Init() {
- this.name = "MyModel"
- }
- }
- workerPort.onmessage = function(d) {
- console.log("worker.js onmessage");
- let data = d.data;
- let func1 = function() {
- console.log("post message is function");
- }
- let obj1 = {
- "index": 2,
- "name1": "zhangshan",
- setName() {
- this.index = 3;
- }
- }
- let obj2 = new MyModel();
- // workerPort.postMessage(func1); 傳遞func1發(fā)生序列化錯(cuò)誤
- // workerPort.postMessage(obj1); 傳遞obj1發(fā)生序列化錯(cuò)誤
- workerPort.postMessage(obj2); // 傳遞obj2不會(huì)發(fā)生序列化錯(cuò)誤
- }
- workerPort.onmessageerror = function(e) {
- console.log("worker.js onmessageerror");
- }
- workerPort.onerror = function(e) {
- console.log("worker.js onerror");
- }
Worker基于Actor并發(fā)模型實(shí)現(xiàn)。在Worker的交互流程中,JS主線程可以創(chuàng)建多個(gè)Worker子線程,各個(gè)Worker線程間相互隔離,并通過(guò)序列化傳遞對(duì)象,等到Worker線程完成計(jì)算任務(wù),再把結(jié)果返回給主線程。
Actor并發(fā)模型的交互原理:各個(gè)Actor并發(fā)地處理主線程任務(wù),每個(gè)Actor內(nèi)部都有一個(gè)消息隊(duì)列及單線程執(zhí)行模塊,消息隊(duì)列負(fù)責(zé)接收主線程及其他Actor的請(qǐng)求,單線程執(zhí)行模塊則負(fù)責(zé)串行地處理請(qǐng)求、向其他Actor發(fā)送請(qǐng)求以及創(chuàng)建新的Actor。由于Actor采用的是異步方式,各個(gè)Actor之間相互隔離沒(méi)有數(shù)據(jù)競(jìng)爭(zhēng),因此Actor可以高并發(fā)運(yùn)行。
以API version 9的工程為例。
API version 8及之前的版本僅支持FA模型,如需使用,注意更換構(gòu)造Worker的接口和創(chuàng)建worker線程中與主線程通信的對(duì)象的兩個(gè)方法。
- // main.js(同級(jí)目錄為例)
- import worker from '@ohos.worker';
- // 主線程中創(chuàng)建Worker對(duì)象
- const workerInstance = new worker.ThreadWorker("workers/worker.ts");
- // 創(chuàng)建js和ts文件都可以
- // const workerInstance = new worker.ThreadWorker("workers/worker.js");
- // API version 9之前版本,worker對(duì)象的構(gòu)造方法
- // const workerInstance = new worker.Worker("workers/worker.js");
- // 主線程向worker線程傳遞信息
- workerInstance.postMessage("123");
- // 主線程接收worker線程信息
- workerInstance.onmessage = function(e) {
- // data:worker線程發(fā)送的信息
- let data = e.data;
- console.log("main.js onmessage");
- // 銷(xiāo)毀Worker對(duì)象
- workerInstance.terminate();
- }
- // 在調(diào)用terminate后,執(zhí)行回調(diào)onexit
- workerInstance.onexit = function() {
- console.log("main.js terminate");
- }
- // worker.ts
- import worker from '@ohos.worker';
- // 創(chuàng)建worker線程中與主線程通信的對(duì)象
- const workerPort = worker.workerPort
- // API version 9之前版本,創(chuàng)建worker線程中與主線程通信的對(duì)象
- // const parentPort = worker.parentPort
- // worker線程接收主線程信息
- workerPort.onmessage = function(e) {
- // data:主線程發(fā)送的信息
- let data = e.data;
- console.log("worker.ts onmessage");
- // worker線程向主線程發(fā)送信息
- workerPort.postMessage("123")
- }
- // worker線程發(fā)生error的回調(diào)
- workerPort.onerror= function(e) {
- console.log("worker.ts onerror");
- }
build-profile.json5 配置 :
- "buildOption": {
- "sourceOption": {
- "workers": [
- "./src/main/ets/MainAbility/workers/worker.ts"
- ]
- }
- }
- // main.js(以不同目錄為例)
- import worker from '@ohos.worker';
- // 主線程中創(chuàng)建Worker對(duì)象
- const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.ts");
- // 創(chuàng)建js和ts文件都可以
- // const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.js");
- // 主線程向worker線程傳遞信息
- workerInstance.postMessage("123");
- // 主線程接收worker線程信息
- workerInstance.onmessage = function(e) {
- // data:worker線程發(fā)送的信息
- let data = e.data;
- console.log("main.js onmessage");
- // 銷(xiāo)毀Worker對(duì)象
- workerInstance.terminate();
- }
- // 在調(diào)用terminate后,執(zhí)行onexit
- workerInstance.onexit = function() {
- console.log("main.js terminate");
- }
- // worker.ts
- import worker from '@ohos.worker';
- // 創(chuàng)建worker線程中與主線程通信的對(duì)象
- const workerPort = worker.workerPort
- // worker線程接收主線程信息
- workerPort.onmessage = function(e) {
- // data:主線程發(fā)送的信息
- let data = e.data;
- console.log("worker.ts onmessage");
- // worker線程向主線程發(fā)送信息
- workerPort.postMessage("123")
- }
- // worker線程發(fā)生error的回調(diào)
- workerPort.onerror= function(e) {
- console.log("worker.ts onerror");
- }
build-profile.json5 配置:
- "buildOption": {
- "sourceOption": {
- "workers": [
- "./src/main/ets/pages/workers/worker.ts"
- ]
- }
- }
更多建議: