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