启动一个Worker

2024-01-23 18:19 更新

Worker是与主线程并行的独立线程。创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处理耗时操作但不可以直接操作UI。

Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与主线程分离,在后台线程中运行一个脚本操作耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。由于Worker一旦被创建则不会主动被销毁,若不处于任务状态一直运行,在一定程度上会造成资源的浪费,应及时关闭空闲的Worker。

Worker的上下文对象和主线程的上下文对象是不同的,Worker线程不支持UI操作。

说明

本模块首批接口从API version 7 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

导入模块

  1. import worker from '@ohos.worker';

属性

系统能力: SystemCapability.Utils.Lang

名称

类型

可读

可写

说明

workerPort9+

ThreadWorkerGlobalScope

worker线程用于与宿主线程通信的对象。

parentPort(deprecated)

DedicatedWorkerGlobalScope

worker线程用于与宿主线程通信的对象。

此属性从API version 7开始支持,从API version 9 开始被废弃。

建议使用workerPort9+替代。

WorkerOptions

Worker构造函数的选项信息,用于为Worker添加其他信息。

系统能力: SystemCapability.Utils.Lang

名称

类型

只读

必填

说明

type

"classic" | "module"

Worker执行脚本的模式类型,暂不支持module类型,默认值为"classic"。

name

string

Worker的名称,默认值为undefined。

shared

boolean

表示Worker共享功能,此接口暂不支持。

ThreadWorker9+

使用以下方法前,均需先构造ThreadWorker实例,ThreadWorker类继承WorkerEventTarget

constructor9+

constructor(scriptURL: string, options?: WorkerOptions)

ThreadWorker构造函数。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

scriptURL

string

Worker执行脚本的路径。

在FA和Stage模型下,DevEco Studio新建Worker工程路径分别存在以下两种情况:

(a) worker脚本所在目录与pages目录同级。

(b) worker脚本所在目录与pages目录不同级。

options

WorkerOptions

Worker构造的选项。

返回值:

类型

说明

ThreadWorker

执行ThreadWorker构造函数生成的ThreadWorker对象,失败则返回undefined。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200003

Worker initialization failure.

10200007

The worker file patch is invalid path.

示例:

  1. import worker from '@ohos.worker';
  2. // worker线程创建
  3. // FA模型-目录同级(entry模块下,workers目录与pages目录同级)
  4. const workerFAModel01 = new worker.ThreadWorker("workers/worker.js", {name:"first worker in FA model"});
  5. // FA模型-目录不同级(entry模块下,workers目录与pages目录的父目录同级)
  6. const workerFAModel02 = new worker.ThreadWorker("../workers/worker.js");
  7. // Stage模型-目录同级(entry模块下,workers目录与pages目录同级)
  8. const workerStageModel01 = new worker.ThreadWorker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
  9. // Stage模型-目录不同级(entry模块下,workers目录是pages目录的子目录)
  10. const workerStageModel02 = new worker.ThreadWorker('entry/ets/pages/workers/worker.ts');
  11. // 理解Stage模型scriptURL的"entry/ets/workers/worker.ts":
  12. // entry: 为module.json5文件中module的name属性对应的值,ets: 表明当前使用的语言。
  13. // scriptURL与worker文件所在的workers目录层级有关,与new worker所在文件无关。
  14. // Stage模型工程esmodule编译场景下,支持新增的scriptURL规格:@bundle:bundlename/entryname/ets/workerdir/workerfile
  15. // @bundle:为固定标签,bundlename为当前应用包名,entryname为当前模块名,ets为当前使用语言
  16. // workerdir为worker文件所在目录,workerfile为worker文件名
  17. // Stage模型-目录同级(entry模块下,workers目录与pages目录同级),假设bundlename是com.example.workerdemo
  18. const workerStageModel03 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/workers/worker');
  19. // Stage模型-目录不同级(entry模块下,workers目录是pages目录的子目录),假设bundlename是com.example.workerdemo
  20. const workerStageModel04 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/pages/workers/worker');

同时,需在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息,主要分为下面两种情况:

(1) 目录同级

FA模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/MainAbility/workers/worker.ts"
  5. ]
  6. }
  7. }

Stage模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/workers/worker.ts"
  5. ]
  6. }
  7. }

(2) 目录不同级

FA模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/workers/worker.ts"
  5. ]
  6. }
  7. }

Stage模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/pages/workers/worker.ts"
  5. ]
  6. }
  7. }

postMessage9+

postMessage(message: Object, transfer: ArrayBuffer[]): void

宿主线程通过转移对象所有权的方式向Worker线程发送消息。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

message

Object

发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见其他说明

transfer

ArrayBuffer[]

表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用,数组不可传入null。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200006

Serializing an uncaught exception failed.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. var buffer = new ArrayBuffer(8);
  3. workerInstance.postMessage(buffer, [buffer]);

postMessage9+

postMessage(message: Object, options?: PostMessageOptions): void

宿主线程通过转移对象所有权或者拷贝数据的方式向Worker线程发送消息。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

message

Object

发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见其他说明

options

PostMessageOptions

当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用。若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到Worker线程。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200006

Serializing an uncaught exception failed.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.postMessage("hello world");
  3. var buffer = new ArrayBuffer(8);
  4. workerInstance.postMessage(buffer, [buffer]);

on9+

on(type: string, listener: WorkerEventListener): void

向Worker添加一个事件监听,该接口与addEventListener9+接口功能一致。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

监听的事件类型。

listener

WorkerEventListener

回调的事件。回调事件。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.on("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

once9+

once(type: string, listener: WorkerEventListener): void

向Worker添加一个事件监听,事件监听只执行一次便自动删除。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

监听的事件类型。

listener

WorkerEventListener

回调的事件。回调事件。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.once("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

off9+

off(type: string, listener?: WorkerEventListener): void

删除类型为type的事件监听,该接口与removeEventListener9+接口功能一致。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

需要删除的事件类型。

listener

WorkerEventListener

回调的事件。删除的回调事件。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. //使用on接口、once接口或addEventListener接口创建“alert”事件,使用off接口删除事件。
  3. workerInstance.off("alert");

terminate9+

terminate(): void

销毁Worker线程,终止Worker接收消息。

系统能力: SystemCapability.Utils.Lang

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.terminate();

onexit9+

onexit?: (code: number) => void

Worker对象的onexit属性表示Worker销毁时被调用的事件处理程序,处理程序在宿主线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

code

number

Worker退出的code。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.onexit = function(e) {
  3. console.log("onexit");
  4. }
  5. // onexit被执行两种方式:
  6. // 主线程:
  7. workerInstance.terminate();
  8. // worker线程:
  9. // workerPort.close()

onerror9+

onerror?: (err: ErrorEvent) => void

Worker对象的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在宿主线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

err

ErrorEvent

异常数据。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.onerror = function(e) {
  3. console.log("onerror");
  4. }

onmessage9+

onmessage?: (event: MessageEvents) => void

Worker对象的onmessage属性表示宿主线程接收到来自其创建的Worker通过workerPort.postMessage接口发送的消息时被调用的事件处理程序,处理程序在宿主线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

event

MessageEvents

收到的Worker消息数据。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.onmessage = function(e) {
  3. // e : MessageEvents, 用法如下:
  4. // let data = e.data;
  5. console.log("onmessage");
  6. }

onmessageerror9+

onmessageerror?: (event: MessageEvents) => void

Worker对象的onmessageerror属性表示当Worker对象接收到一条无法被序列化的消息时被调用的事件处理程序,处理程序在宿主线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

event

MessageEvents

异常数据。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.onmessageerror= function(e) {
  3. console.log("onmessageerror");
  4. }

addEventListener9+

addEventListener(type: string, listener: WorkerEventListener): void

向Worker添加一个事件监听,该接口与on9+接口功能一致。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

监听的事件类型。

listener

WorkerEventListener

回调的事件。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

removeEventListener9+

removeEventListener(type: string, callback?: WorkerEventListener): void

删除Worker的事件监听,该接口与off9+接口功能一致。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

需要删除的监听事件类型。

callback

WorkerEventListener

回调的事件。删除的回调事件。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeEventListener("alert");

dispatchEvent9+

dispatchEvent(event: Event): boolean

分发定义在Worker的事件。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

event

Event

需要分发的事件。

返回值:

类型

说明

boolean

分发的结果,false表示分发失败。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。

分发事件(dispatchEvent)可与监听接口(on、once、addEventListener)搭配使用,示例如下:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. //用法一:
  3. workerInstance.on("alert_on", (e)=>{
  4. console.log("alert listener callback");
  5. })
  6. workerInstance.once("alert_once", (e)=>{
  7. console.log("alert listener callback");
  8. })
  9. workerInstance.addEventListener("alert_add", (e)=>{
  10. console.log("alert listener callback");
  11. })
  12. //once接口创建的事件执行一次便会删除。
  13. workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
  14. //on接口创建的事件可以一直被分发,不能主动删除。
  15. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  16. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  17. //addEventListener接口创建的事件可以一直被分发,不能主动删除。
  18. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  19. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  20. //用法二:
  21. //event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
  22. //当type = "message",onmessage接口定义的方法同时会执行。
  23. //当type = "messageerror",onmessageerror接口定义的方法同时会执行。
  24. //当type = "error",onerror接口定义的方法同时会执行。
  25. //若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。
  26. workerInstance.addEventListener("message", (e)=>{
  27. console.log("message listener callback");
  28. })
  29. workerInstance.onmessage = function(e) {
  30. console.log("onmessage : message listener callback");
  31. }
  32. //调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
  33. workerInstance.dispatchEvent({type:"message", timeStamp:0});

removeAllListener9+

removeAllListener(): void

删除Worker所有的事件监听。

系统能力: SystemCapability.Utils.Lang

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeAllListener();

WorkerEventTarget9+

处理Worker监听事件。

addEventListener9+

addEventListener(type: string, listener: WorkerEventListener): void

向Worker添加一个事件监听,该接口与on9+接口功能一致。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

监听的事件类型。

listener

WorkerEventListener

回调的事件。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

removeEventListener9+

removeEventListener(type: string, callback?: WorkerEventListener): void

删除Worker的事件监听,该接口与off9+接口功能一致。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

需要删除的监听事件类型。

callback

WorkerEventListener

回调的事件。删除的回调事件。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeEventListener("alert");

dispatchEvent9+

dispatchEvent(event: Event): boolean

分发定义在Worker的事件。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

event

Event

需要分发的事件。

返回值:

类型

说明

boolean

分发的结果,false表示分发失败。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。

分发事件(dispatchEvent)可与监听接口(on、once、addEventListener)搭配使用,示例如下:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. //用法一:
  3. workerInstance.on("alert_on", (e)=>{
  4. console.log("alert listener callback");
  5. })
  6. workerInstance.once("alert_once", (e)=>{
  7. console.log("alert listener callback");
  8. })
  9. workerInstance.addEventListener("alert_add", (e)=>{
  10. console.log("alert listener callback");
  11. })
  12. //once接口创建的事件执行一次便会删除。
  13. workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
  14. //on接口创建的事件可以一直被分发,不能主动删除。
  15. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  16. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  17. //addEventListener接口创建的事件可以一直被分发,不能主动删除。
  18. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  19. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  20. //用法二:
  21. //event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
  22. //当type = "message",onmessage接口定义的方法同时会执行。
  23. //当type = "messageerror",onmessageerror接口定义的方法同时会执行。
  24. //当type = "error",onerror接口定义的方法同时会执行。
  25. //若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。
  26. workerInstance.addEventListener("message", (e)=>{
  27. console.log("message listener callback");
  28. })
  29. workerInstance.onmessage = function(e) {
  30. console.log("onmessage : message listener callback");
  31. }
  32. //调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
  33. workerInstance.dispatchEvent({type:"message", timeStamp:0});

removeAllListener9+

removeAllListener(): void

删除Worker所有的事件监听。

系统能力: SystemCapability.Utils.Lang

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeAllListener();

ThreadWorkerGlobalScope9+

Worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口销毁Worker线程。ThreadWorkerGlobalScope类继承GlobalScope9+

postMessage9+

postMessage(messageObject: Object, transfer: ArrayBuffer[]): void

Worker线程通过转移对象所有权的方式向宿主线程发送消息。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

message

Object

发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见其他说明

transfer

ArrayBuffer[]

表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用,数组不可传入null。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200006

Serializing an uncaught exception failed.

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = function(e) {
  6. // let data = e.data;
  7. console.log("receive data from worker.js");
  8. }
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = function(e){
  5. // let data = e.data;
  6. var buffer = new ArrayBuffer(8);
  7. workerPort.postMessage(buffer, [buffer]);
  8. }

postMessage9+

postMessage(messageObject: Object, options?: PostMessageOptions): void

Worker线程通过转移对象所有权或者拷贝数据的方式向宿主线程发送消息。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

message

Object

发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见其他说明

options

PostMessageOptions

当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用。若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到宿主线程。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200006

Serializing an uncaught exception failed.

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = function(e) {
  6. // let data = e.data;
  7. console.log("receive data from worker.js");
  8. }
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = function(e){
  5. // let data = e.data;
  6. workerPort.postMessage("receive data from main.js");
  7. }

close9+

close(): void

销毁Worker线程,终止Worker接收消息。

系统能力: SystemCapability.Utils.Lang

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = function(e) {
  5. workerPort.close()
  6. }

onmessage9+

onmessage?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) => void

ThreadWorkerGlobalScope的onmessage属性表示Worker线程收到来自其宿主线程通过postMessage接口发送的消息时被调用的事件处理程序,处理程序在Worker线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

this

ThreadWorkerGlobalScope

指向调用者对象。

ev

MessageEvents

收到宿主线程发送的数据。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  4. workerInstance.postMessage("hello world");
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = function(e) {
  5. console.log("receive main.js message");
  6. }

onmessageerror9+

onmessageerror?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) => void

ThreadWorkerGlobalScope的onmessageerror属性表示当Worker对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在Worker线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

this

ThreadWorkerGlobalScope

指向调用者对象。

ev

MessageEvents

异常数据。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessageerror = function(e) {
  5. console.log("worker.js onmessageerror")
  6. }

WorkerEventListener9+

(event: Event): void | Promise<void>

事件监听类。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

event

Event

回调的事件类。

返回值:

类型

说明

void | Promise<void>

无返回值或者以Promise形式返回。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码

错误码ID

错误信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

GlobalScope9+

Worker线程自身的运行环境,GlobalScope类继承WorkerEventTarget

属性

系统能力: SystemCapability.Utils.Lang

名称

类型

可读

可写

说明

name

string

Worker的名字,new Worker时指定。

self

GlobalScope & typeof globalThis

GlobalScope本身。

onerror9+

onerror?: (ev: ErrorEvent) => void

GlobalScope的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在Worker线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

ev

ErrorEvent

异常数据。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts")
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort
  4. workerPort.onerror = function(e){
  5. console.log("worker.js onerror")
  6. }

MessageEvents9+

消息类,持有Worker线程间传递的数据。

系统能力: SystemCapability.Utils.Lang

名称

类型

可读

可写

说明

data

any

线程间传递的数据。

Worker(deprecated)

使用以下方法前,均需先构造Worker实例,Worker类继承EventTarget

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker9+替代。

constructor(deprecated)

constructor(scriptURL: string, options?: WorkerOptions)

Worker构造函数。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker.constructor9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

scriptURL

string

Worker执行脚本的路径。

在FA和Stage模型下,DevEco Studio新建Worker工程路径分别存在以下两种情况:

(a) worker脚本所在目录与pages目录同级。

(b) worker脚本所在目录与pages目录不同级。

options

WorkerOptions

Worker构造的选项。

返回值:

类型

说明

Worker

执行Worker构造函数生成的Worker对象,失败则返回undefined。

示例:

  1. import worker from '@ohos.worker';
  2. // worker线程创建
  3. // FA模型-目录同级
  4. const workerFAModel01 = new worker.Worker("workers/worker.js", {name:"first worker in FA model"});
  5. // FA模型-目录不同级(以workers目录放置pages目录前一级为例)
  6. const workerFAModel02 = new worker.Worker("../workers/worker.js");
  7. // Stage模型-目录同级
  8. const workerStageModel01 = new worker.Worker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
  9. // Stage模型-目录不同级(以workers目录放置pages目录后一级为例)
  10. const workerStageModel02 = new worker.Worker('entry/ets/pages/workers/worker.ts');
  11. // 理解Stage模型scriptURL的"entry/ets/workers/worker.ts":
  12. // entry: 为module.json5文件中module的name属性对应的值;
  13. // ets: 表明当前使用的语言。

同时,需在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息,主要分为下面两种情况:

(1) 目录同级

FA模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/MainAbility/workers/worker.ts"
  5. ]
  6. }
  7. }

Stage模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/workers/worker.ts"
  5. ]
  6. }
  7. }

(2) 目录不同级

FA模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/workers/worker.ts"
  5. ]
  6. }
  7. }

Stage模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/pages/workers/worker.ts"
  5. ]
  6. }
  7. }

postMessage(deprecated)

postMessage(message: Object, transfer: ArrayBuffer[]): void

宿主线程通过转移对象所有权的方式向Worker线程发送消息。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker.postMessage9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

message

Object

发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见其他说明

transfer

ArrayBuffer[]

表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用,数组不可传入null。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. var buffer = new ArrayBuffer(8);
  3. workerInstance.postMessage(buffer, [buffer]);

postMessage(deprecated)

postMessage(message: Object, options?: PostMessageOptions): void

宿主线程通过转移对象所有权或者拷贝数据的方式向Worker线程发送消息。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker.postMessage9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

message

Object

发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见其他说明

options

PostMessageOptions

当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用。若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到Worker线程。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.postMessage("hello world");
  3. var buffer = new ArrayBuffer(8);
  4. workerInstance.postMessage(buffer, [buffer]);

on(deprecated)

on(type: string, listener: EventListener): void

向Worker添加一个事件监听,该接口与addEventListener(deprecated)接口功能一致。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker.on9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

监听的事件类型。

listener

EventListener

回调事件。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.on("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

once(deprecated)

once(type: string, listener: EventListener): void

向Worker添加一个事件监听,事件监听只执行一次便自动删除。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker.once9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

监听的事件类型。

listener

EventListener

回调事件。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.once("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

off(deprecated)

off(type: string, listener?: EventListener): void

删除类型为type的事件监听,该接口与removeEventListener(deprecated)接口功能一致。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker.off9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

需要删除的事件类型。

listener

EventListener

删除的回调事件。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. //使用on接口、once接口或addEventListener接口创建“alert”事件,使用off接口删除事件。
  3. workerInstance.off("alert");

terminate(deprecated)

terminate(): void

销毁Worker线程,终止Worker接收消息。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker.terminate9+替代。

系统能力: SystemCapability.Utils.Lang

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.terminate();

onexit(deprecated)

onexit?: (code: number) => void

Worker对象的onexit属性表示Worker销毁时被调用的事件处理程序,处理程序在宿主线程中执行。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker.onexit9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

code

number

Worker退出的code。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.onexit = function(e) {
  3. console.log("onexit");
  4. }
  5. //onexit被执行两种方式:
  6. //主线程:
  7. workerInstance.terminate();
  8. //worker线程:
  9. //parentPort.close()

onerror(deprecated)

onerror?: (err: ErrorEvent) => void

Worker对象的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在宿主线程中执行。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker.onerror9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

err

ErrorEvent

异常数据。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.onerror = function(e) {
  3. console.log("onerror");
  4. }

onmessage(deprecated)

onmessage?: (event: MessageEvent) => void

Worker对象的onmessage属性表示宿主线程接收到来自其创建的Worker通过parentPort.postMessage接口发送的消息时被调用的事件处理程序,处理程序在宿主线程中执行。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker.onmessage9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

event

MessageEvent

收到的Worker消息数据。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.onmessage = function(e) {
  3. // e : MessageEvent, 用法如下:
  4. // let data = e.data;
  5. console.log("onmessage");
  6. }

onmessageerror(deprecated)

onmessageerror?: (event: MessageEvent) => void

Worker对象的onmessageerror属性表示当Worker对象接收到一条无法被序列化的消息时被调用的事件处理程序,处理程序在宿主线程中执行。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorker.onmessageerror9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

event

MessageEvent

异常数据。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.onmessageerror= function(e) {
  3. console.log("onmessageerror");
  4. }

EventTarget(deprecated)

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用WorkerEventTarget9+替代。

addEventListener(deprecated)

addEventListener(type: string, listener: EventListener): void

向Worker添加一个事件监听,该接口与on(deprecated)接口功能一致。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用addEventListener9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

监听的事件类型。

listener

EventListener

回调的事件。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

removeEventListener(deprecated)

removeEventListener(type: string, callback?: EventListener): void

删除Worker的事件监听,该接口与off(deprecated)接口功能一致。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用removeEventListener9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

type

string

需要删除的监听事件类型。

callback

EventListener

删除的回调事件。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeEventListener("alert");

dispatchEvent(deprecated)

dispatchEvent(event: Event): boolean

分发定义在Worker的事件。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用dispatchEvent9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

event

Event

需要分发的事件。

返回值:

类型

说明

boolean

分发的结果,false表示分发失败。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。

分发事件(dispatchEvent)可与监听接口(on、once、addEventListener)搭配使用,示例如下:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. //用法一:
  3. workerInstance.on("alert_on", (e)=>{
  4. console.log("alert listener callback");
  5. })
  6. workerInstance.once("alert_once", (e)=>{
  7. console.log("alert listener callback");
  8. })
  9. workerInstance.addEventListener("alert_add", (e)=>{
  10. console.log("alert listener callback");
  11. })
  12. //once接口创建的事件执行一次便会删除。
  13. workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
  14. //on接口创建的事件可以一直被分发,不能主动删除。
  15. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  16. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  17. //addEventListener接口创建的事件可以一直被分发,不能主动删除。
  18. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  19. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  20. //用法二:
  21. //event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
  22. //当type = "message",onmessage接口定义的方法同时会执行。
  23. //当type = "messageerror",onmessageerror接口定义的方法同时会执行。
  24. //当type = "error",onerror接口定义的方法同时会执行。
  25. //若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。
  26. workerInstance.addEventListener("message", (e)=>{
  27. console.log("message listener callback");
  28. })
  29. workerInstance.onmessage = function(e) {
  30. console.log("onmessage : message listener callback");
  31. }
  32. //调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
  33. workerInstance.dispatchEvent({type:"message", timeStamp:0});

removeAllListener(deprecated)

removeAllListener(): void

删除Worker所有的事件监听。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用removeAllListener9+替代。

系统能力: SystemCapability.Utils.Lang

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeAllListener();

DedicatedWorkerGlobalScope(deprecated)

Worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口销毁Worker线程。DedicatedWorkerGlobalScope类继承WorkerGlobalScope

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorkerGlobalScope9+替代。

postMessage9+

postMessage(messageObject: Object, transfer: ArrayBuffer[]): void

Worker线程通过转移对象所有权的方式向宿主线程发送消息。

说明

DedicatedWorkerGlobalScope类自API version 9 开始废弃,本接口建议使用ThreadWorkerGlobalScope.postMessage替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

message

Object

发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见其他说明

transfer

ArrayBuffer[]

表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用,数组不可传入null。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = function(e) {
  6. // let data = e.data;
  7. console.log("receive data from worker.js");
  8. }
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = function(e){
  5. // let data = e.data;
  6. let buffer = new ArrayBuffer(5)
  7. workerPort.postMessage(buffer, [buffer]);
  8. }

postMessage(deprecated)

postMessage(messageObject: Object, transfer: Transferable[]): void

Worker线程通过转移对象所有权的方式向宿主线程发送消息。

说明

此接口暂不支持使用,从API version 9 开始废弃,建议使用ThreadWorkerGlobalScope.postMessage替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

messageObject

Object

发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见其他说明

options

Transferable[]

暂不支持该参数类型。

postMessage(deprecated)

postMessage(messageObject: Object, options?: PostMessageOptions): void

Worker线程通过转移对象所有权或者拷贝数据的方式向宿主线程发送消息。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorkerGlobalScope.postMessage替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

message

Object

发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见其他说明

options

PostMessageOptions

当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用。若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到宿主线程。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = function(e) {
  6. // let data = e.data;
  7. console.log("receive data from worker.js");
  8. }
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const parentPort = worker.parentPort;
  4. parentPort.onmessage = function(e){
  5. // let data = e.data;
  6. parentPort.postMessage("receive data from main.js");
  7. }

close(deprecated)

close(): void

销毁Worker线程,终止Worker接收消息。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorkerGlobalScope.close替代。

系统能力: SystemCapability.Utils.Lang

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js");
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const parentPort = worker.parentPort;
  4. parentPort.onmessage = function(e) {
  5. parentPort.close()
  6. }

onmessage(deprecated)

onmessage?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) => void

DedicatedWorkerGlobalScope的onmessage属性表示Worker线程收到来自其宿主线程通过postMessage接口发送的消息时被调用的事件处理程序,处理程序在Worker线程中执行。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorkerGlobalScope.onmessage替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

this

DedicatedWorkerGlobalScope

指向调用者对象。

ev

MessageEvent

收到宿主线程发送的数据。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js");
  4. workerInstance.postMessage("hello world");
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const parentPort = worker.parentPort;
  4. parentPort.onmessage = function(e) {
  5. console.log("receive main.js message");
  6. }

onmessageerror(deprecated)

onmessageerror?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) => void

DedicatedWorkerGlobalScope的onmessageerror属性表示当Worker对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在Worker线程中执行。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用ThreadWorkerGlobalScope.onmessageerror替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

this

DedicatedWorkerGlobalScope

指向调用者对象。

ev

MessageEvent

异常数据。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js");
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const parentPort = worker.parentPort;
  4. parentPort.onmessageerror = function(e) {
  5. console.log("worker.js onmessageerror")
  6. }

PostMessageOptions

明确数据传递过程中需要转移所有权对象的类,传递所有权的对象必须是ArrayBuffer,发送它的上下文中将会变为不可用,仅在接收方可用。

系统能力: SystemCapability.Utils.Lang

名称

类型

可读

可写

说明

transfer

Object[]

ArrayBuffer数组,用于传递所有权。该数组中不可传入null。

Event

事件类。

系统能力: SystemCapability.Utils.Lang

名称

类型

可读

可写

说明

type

string

指定事件的类型。

timeStamp

number

事件创建时的时间戳(精度为毫秒),暂未支持。

EventListener(deprecated)

(evt: Event): void | Promise<void>

事件监听类。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用WorkerEventListener9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

evt

Event

回调的事件类。

返回值:

类型

说明

void | Promise<void>

无返回值或者以Promise形式返回。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

ErrorEvent

错误事件类,用于表示Worker执行过程中出现异常的详细信息,ErrorEvent类继承Event

系统能力: SystemCapability.Utils.Lang

名称

类型

可读

可写

说明

message

string

异常发生的错误信息。

filename

string

出现异常所在的文件。

lineno

number

异常所在的行数。

colno

number

异常所在的列数。

error

Object

异常类型。

MessageEvent<T>

消息类,持有Worker线程间传递的数据。

系统能力: SystemCapability.Utils.Lang

名称

类型

可读

可写

说明

data

T

线程间传递的数据。

WorkerGlobalScope(deprecated)

Worker线程自身的运行环境,WorkerGlobalScope类继承EventTarget

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用GlobalScope9+替代。

属性

系统能力: SystemCapability.Utils.Lang

名称

类型

可读

可写

说明

name

string

Worker的名字,new Worker时指定。

self

WorkerGlobalScope & typeof globalThis

WorkerGlobalScope本身。

onerror(deprecated)

onerror?: (ev: ErrorEvent) => void

WorkerGlobalScope的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在Worker线程中执行。

说明

从API version 7 开始支持,从API version 9 开始废弃,建议使用GlobalScope.onerror替代。

系统能力: SystemCapability.Utils.Lang

参数:

参数名

类型

必填

说明

ev

ErrorEvent

异常数据。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js")
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const parentPort = worker.parentPort
  4. parentPort.onerror = function(e){
  5. console.log("worker.js onerror")
  6. }

其他说明

序列化支持类型

Type

备注

是否支持

All Primitive Type

不包括symbol

Date

 

String

 

RegExp

 

Array

 

Map

 

Set

 

Object

只支持Plain Object,不支持带function的

ArrayBuffer

提供transfer能力

TypedArray

 

特例:传递通过自定义class创建出来的object时,不会发生序列化错误,但是自定义class的属性(如Function)无法通过序列化传递。

说明

以API version 9的FA工程为例。

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("workers/worker.js");
  4. workerInstance.postMessage("message from main to worker");
  5. workerInstance.onmessage = function(d) {
  6. // 当worker线程传递obj2时,data即为obj2。data没有Init、SetName的方法
  7. let data = d.data;
  8. }
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. class MyModel {
  5. name = "undefined"
  6. Init() {
  7. this.name = "MyModel"
  8. }
  9. }
  10. workerPort.onmessage = function(d) {
  11. console.log("worker.js onmessage");
  12. let data = d.data;
  13. let func1 = function() {
  14. console.log("post message is function");
  15. }
  16. let obj1 = {
  17. "index": 2,
  18. "name1": "zhangshan",
  19. setName() {
  20. this.index = 3;
  21. }
  22. }
  23. let obj2 = new MyModel();
  24. // workerPort.postMessage(func1); 传递func1发生序列化错误
  25. // workerPort.postMessage(obj1); 传递obj1发生序列化错误
  26. workerPort.postMessage(obj2); // 传递obj2不会发生序列化错误
  27. }
  28. workerPort.onmessageerror = function(e) {
  29. console.log("worker.js onmessageerror");
  30. }
  31. workerPort.onerror = function(e) {
  32. console.log("worker.js onerror");
  33. }

内存模型

Worker基于Actor并发模型实现。在Worker的交互流程中,JS主线程可以创建多个Worker子线程,各个Worker线程间相互隔离,并通过序列化传递对象,等到Worker线程完成计算任务,再把结果返回给主线程。

Actor并发模型的交互原理:各个Actor并发地处理主线程任务,每个Actor内部都有一个消息队列及单线程执行模块,消息队列负责接收主线程及其他Actor的请求,单线程执行模块则负责串行地处理请求、向其他Actor发送请求以及创建新的Actor。由于Actor采用的是异步方式,各个Actor之间相互隔离没有数据竞争,因此Actor可以高并发运行。

注意事项

  • Worker存在数量限制,当前支持最多同时存在8个Worker。
  • 在API version 8及之前的版本,当Worker数量超出限制时,会抛出错误Error "Too many workers, the number of workers exceeds the maximum."。
  • 从API version 9开始,当Worker数量超出限制时,会抛出错误BusinessError "Worker initialization failure, the number of workers exceeds the maximum."。
  • 主动销毁Worker可以调用新创建Worker对象的terminate()或workerPort.close()方法。
  • 自API version 9版本开始,若Worker处于已经销毁或正在销毁等非运行状态时,调用其功能接口,会抛出相应的BusinessError。
  • Worker的创建和销毁耗费性能,建议管理已创建的Worker并重复使用。
  • 创建Worker工程时,new worker.Worker构造函数和new worker.ThreadWorker构造函数不能同时使用,否则将导致工程中Worker的功能异常。自API version 9版本开始,建议使用new worker.ThreadWorker构造函数,在API version 8及之前的版本,建议使用new worker.Worker构造函数。
  • 创建Worker工程时,在Worker线程的文件中(比如本文中worker.ts)不能导入任何有关构建UI的方法(比如ETS文件等),否则会导致Worker的功能失效。排查方式:解压生成的Hap包,在创建Worker线程的文件目录中找到"worker.js",全局搜索"View"关键字。如果存在该关键字,说明在worker.js中打包进去了构建UI的方法,会导致Worker的功能失效,建议在创建Worker线程的文件中修改 "import “xxx” from src"中src的目录层级。
  • 线程间通信时传递的数据量最大限制为16M。

完整示例

说明

以API version 9的工程为例。

API version 8及之前的版本仅支持FA模型,如需使用,注意更换构造Worker的接口和创建worker线程中与主线程通信的对象的两个方法。

FA模型

  1. // main.js(同级目录为例)
  2. import worker from '@ohos.worker';
  3. // 主线程中创建Worker对象
  4. const workerInstance = new worker.ThreadWorker("workers/worker.ts");
  5. // 创建js和ts文件都可以
  6. // const workerInstance = new worker.ThreadWorker("workers/worker.js");
  7. // API version 9之前版本,worker对象的构造方法
  8. // const workerInstance = new worker.Worker("workers/worker.js");
  9. // 主线程向worker线程传递信息
  10. workerInstance.postMessage("123");
  11. // 主线程接收worker线程信息
  12. workerInstance.onmessage = function(e) {
  13. // data:worker线程发送的信息
  14. let data = e.data;
  15. console.log("main.js onmessage");
  16. // 销毁Worker对象
  17. workerInstance.terminate();
  18. }
  19. // 在调用terminate后,执行回调onexit
  20. workerInstance.onexit = function() {
  21. console.log("main.js terminate");
  22. }
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. // 创建worker线程中与主线程通信的对象
  4. const workerPort = worker.workerPort
  5. // API version 9之前版本,创建worker线程中与主线程通信的对象
  6. // const parentPort = worker.parentPort
  7. // worker线程接收主线程信息
  8. workerPort.onmessage = function(e) {
  9. // data:主线程发送的信息
  10. let data = e.data;
  11. console.log("worker.ts onmessage");
  12. // worker线程向主线程发送信息
  13. workerPort.postMessage("123")
  14. }
  15. // worker线程发生error的回调
  16. workerPort.onerror= function(e) {
  17. console.log("worker.ts onerror");
  18. }

build-profile.json5 配置 :

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/MainAbility/workers/worker.ts"
  5. ]
  6. }
  7. }

Stage模型

  1. // main.js(以不同目录为例)
  2. import worker from '@ohos.worker';
  3. // 主线程中创建Worker对象
  4. const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.ts");
  5. // 创建js和ts文件都可以
  6. // const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.js");
  7. // 主线程向worker线程传递信息
  8. workerInstance.postMessage("123");
  9. // 主线程接收worker线程信息
  10. workerInstance.onmessage = function(e) {
  11. // data:worker线程发送的信息
  12. let data = e.data;
  13. console.log("main.js onmessage");
  14. // 销毁Worker对象
  15. workerInstance.terminate();
  16. }
  17. // 在调用terminate后,执行onexit
  18. workerInstance.onexit = function() {
  19. console.log("main.js terminate");
  20. }
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. // 创建worker线程中与主线程通信的对象
  4. const workerPort = worker.workerPort
  5. // worker线程接收主线程信息
  6. workerPort.onmessage = function(e) {
  7. // data:主线程发送的信息
  8. let data = e.data;
  9. console.log("worker.ts onmessage");
  10. // worker线程向主线程发送信息
  11. workerPort.postMessage("123")
  12. }
  13. // worker线程发生error的回调
  14. workerPort.onerror= function(e) {
  15. console.log("worker.ts onerror");
  16. }

build-profile.json5 配置:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/pages/workers/worker.ts"
  5. ]
  6. }
  7. }
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号