• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.worker (启动一个Worker)
2
3Worker是与主线程并行的独立线程。创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处理耗时操作但不可以直接操作UI。
4
5Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与主线程分离,在后台线程中运行一个脚本操作耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。由于Worker一旦被创建则不会主动被销毁,若不处于任务状态一直运行,在一定程度上会造成资源的浪费,应及时关闭空闲的Worker。
6
7Worker的上下文对象和主线程的上下文对象是不同的,Worker线程不支持UI操作。
8
9> **说明:**<br/>
10> 本模块首批接口从API version 7 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
11
12## 导入模块
13
14```js
15import worker from '@ohos.worker';
16```
17
18
19## 属性
20
21**系统能力:** SystemCapability.Utils.Lang
22
23| 名称                              | 类型                                                      | 可读 | 可写 | 说明                                                         |
24| --------------------------------- | --------------------------------------------------------- | ---- | ---- | ------------------------------------------------------------ |
25| workerPort<sup>9+</sup>           | [ThreadWorkerGlobalScope](#threadworkerglobalscope9)      | 是   | 是   | worker线程用于与宿主线程通信的对象。                         |
26| parentPort<sup>(deprecated)</sup> | [DedicatedWorkerGlobalScope](#dedicatedworkerglobalscope) | 是   | 是   | worker线程用于与宿主线程通信的对象。<br/>此属性从API version 7开始支持,从API version 9 开始被废弃。<br/>建议使用workerPort<sup>9+</sup>替代。 |
27
28
29## WorkerOptions
30
31Worker构造函数的选项信息,用于为Worker添加其他信息。
32
33**系统能力:** SystemCapability.Utils.Lang
34
35| 名称 | 类型 | 可读 | 可写 | 说明 |
36| ---- | -------- | ---- | ---- | -------------- |
37| type | "classic" \| "module" | 是   | 是 | Worker执行脚本的模式类型,暂不支持module类型,默认值为"classic"。 |
38| name | string   | 是   | 是 | Worker的名称,默认值为 undefined 。 |
39| shared | boolean | 是   | 是 | 表示Worker共享功能,此接口暂不支持。 |
40
41
42## ThreadWorker<sup>9+</sup>
43
44使用以下方法前,均需先构造ThreadWorker实例,ThreadWorker类继承[WorkerEventTarget](#workereventtarget9)。
45
46### constructor<sup>9+</sup>
47
48constructor(scriptURL: string, options?: WorkerOptions)
49
50ThreadWorker构造函数。
51
52**系统能力:** SystemCapability.Utils.Lang
53
54**参数:**
55
56| 参数名    | 类型                            | 必填 | 说明                                                         |
57| --------- | ------------------------------- | ---- | ------------------------------------------------------------ |
58| scriptURL | string                          | 是   | Worker执行脚本的路径。<br/>在FA和Stage模型下,DevEco Studio新建Worker工程路径分别存在以下两种情况:<br/>(a) worker脚本所在目录与pages目录同级。<br/>(b) worker脚本所在目录与pages目录不同级。 |
59| options   | [WorkerOptions](#workeroptions) | 否   | Worker构造的选项。                                           |
60
61**返回值:**
62
63| 类型         | 说明                                                         |
64| ------------ | ------------------------------------------------------------ |
65| ThreadWorker | 执行ThreadWorker构造函数生成的ThreadWorker对象,失败则返回undefined。 |
66
67**错误码:**
68
69以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
70
71| 错误码ID | 错误信息 |
72| -------- | -------- |
73| 10200003 | Worker initialization failure. |
74| 10200007 | The worker file patch is invalid path. |
75
76
77
78**示例:**
79
80```js
81import worker from '@ohos.worker';
82// worker线程创建
83
84// FA模型-目录同级(entry模块下,workers目录与pages目录同级)
85const workerFAModel01 = new worker.ThreadWorker("workers/worker.js", {name:"first worker in FA model"});
86// FA模型-目录不同级(entry模块下,workers目录与pages目录的父目录同级)
87const workerFAModel02 = new worker.ThreadWorker("../workers/worker.js");
88
89// Stage模型-目录同级(entry模块下,workers目录与pages目录同级)
90const workerStageModel01 = new worker.ThreadWorker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
91// Stage模型-目录不同级(entry模块下,workers目录是pages目录的子目录)
92const workerStageModel02 = new worker.ThreadWorker('entry/ets/pages/workers/worker.ts');
93
94// 理解Stage模型scriptURL的"entry/ets/workers/worker.ts":
95// entry: 为module.json5文件中module的name属性对应的值,ets: 表明当前使用的语言。
96// scriptURL与worker文件所在的workers目录层级有关,与new worker所在文件无关。
97
98// Stage模型工程esmodule编译场景下,支持新增的scriptURL规格:@bundle:bundlename/entryname/ets/workerdir/workerfile
99// @bundle:为固定标签,bundlename为当前应用包名,entryname为当前模块名,ets为当前使用语言
100// workerdir为worker文件所在目录,workerfile为worker文件名
101// Stage模型-目录同级(entry模块下,workers目录与pages目录同级),假设bundlename是com.example.workerdemo
102const workerStageModel03 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/workers/worker');
103// Stage模型-目录不同级(entry模块下,workers目录是pages目录的子目录),假设bundlename是com.example.workerdemo
104const workerStageModel04 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/pages/workers/worker');
105```
106
107同时,需在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息,主要分为下面两种情况:
108
109(1) 目录同级
110
111FA模型:
112
113```json
114  "buildOption": {
115    "sourceOption": {
116      "workers": [
117        "./src/main/ets/MainAbility/workers/worker.ts"
118      ]
119    }
120  }
121```
122
123Stage模型:
124
125```json
126  "buildOption": {
127    "sourceOption": {
128      "workers": [
129        "./src/main/ets/workers/worker.ts"
130      ]
131    }
132  }
133```
134
135(2) 目录不同级
136
137FA模型:
138
139```json
140  "buildOption": {
141    "sourceOption": {
142      "workers": [
143        "./src/main/ets/workers/worker.ts"
144      ]
145    }
146  }
147```
148
149Stage模型:
150
151```json
152  "buildOption": {
153    "sourceOption": {
154      "workers": [
155        "./src/main/ets/pages/workers/worker.ts"
156      ]
157    }
158  }
159```
160
161### postMessage<sup>9+</sup>
162
163postMessage(message: Object, transfer: ArrayBuffer[]): void;
164
165向Worker线程发送数据,数据类型必须是序列化所支持的类型。序列化支持类型见其他说明。
166
167**系统能力:** SystemCapability.Utils.Lang
168
169**参数:**
170
171| 参数名   | 类型          | 必填 | 说明                                                         |
172| -------- | ------------- | ---- | ------------------------------------------------------------ |
173| message  | Object        | 是   | 发送至Worker的数据。                                         |
174| transfer | ArrayBuffer[] | 是   | 可传递&nbsp;ArrayBuffer&nbsp;的实例对象,数组中不可传入null。 |
175
176**错误码:**
177
178以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
179
180| 错误码ID | 错误信息                                |
181| -------- | ----------------------------------------- |
182| 10200004 | Worker instance is not running.           |
183| 10200006 | Serializing an uncaught exception failed. |
184
185**示例:**
186
187```js
188const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
189
190var buffer = new ArrayBuffer(8);
191workerInstance.postMessage(buffer, [buffer]);
192```
193
194### postMessage<sup>9+</sup>
195
196postMessage(message: Object, options?: PostMessageOptions): void
197
198向Worker线程发送数据,数据类型必须是序列化所支持的类型。序列化支持类型见其他说明。
199
200**系统能力:** SystemCapability.Utils.Lang
201
202**参数:**
203
204| 参数名  | 类型                                      | 必填 | 说明                                                         |
205| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
206| message | Object                                    | 是   | 发送至Worker的数据。                                         |
207| options | [PostMessageOptions](#postmessageoptions) | 否   | 可传输对象是&nbsp;ArrayBuffer&nbsp;的实例对象。若不填入该参数,默认设置为 undefined。|
208
209**错误码:**
210
211以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
212
213| 错误码ID | 错误信息                                |
214| -------- | ----------------------------------------- |
215| 10200004 | Worker instance is not running.           |
216| 10200006 | Serializing an uncaught exception failed. |
217
218**示例:**
219
220```js
221const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
222
223workerInstance.postMessage("hello world");
224
225var buffer = new ArrayBuffer(8);
226workerInstance.postMessage(buffer, [buffer]);
227```
228
229### on<sup>9+</sup>
230
231on(type: string, listener: WorkerEventListener): void
232
233向Worker添加一个事件监听,该接口与[addEventListener<sup>9+</sup>](#addeventlistener9)接口功能一致。
234
235**系统能力:** SystemCapability.Utils.Lang
236
237**参数:**
238
239| 参数名   | 类型                                         | 必填 | 说明                   |
240| -------- | -------------------------------------------- | ---- | ---------------------- |
241| type     | string                                       | 是   | 监听的事件类型。       |
242| listener | [WorkerEventListener](#workereventlistener9) | 是 | 回调的事件。回调事件。 |
243
244**错误码:**
245
246以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
247
248| 错误码ID | 错误信息                                   |
249| -------- | -------------------------------------------- |
250| 10200004 | Worker instance is not running.              |
251| 10200005 | The invoked API is not supported in workers. |
252
253**示例:**
254
255```js
256const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
257workerInstance.on("alert", (e)=>{
258    console.log("alert listener callback");
259})
260```
261
262
263### once<sup>9+</sup>
264
265once(type: string, listener: WorkerEventListener): void
266
267向Worker添加一个事件监听,事件监听只执行一次便自动删除。
268
269**系统能力:** SystemCapability.Utils.Lang
270
271**参数:**
272
273| 参数名   | 类型                                         | 必填 | 说明                   |
274| -------- | -------------------------------------------- | ---- | ---------------------- |
275| type     | string                                       | 是   | 监听的事件类型。       |
276| listener | [WorkerEventListener](#workereventlistener9) | 是 | 回调的事件。回调事件。 |
277
278**错误码:**
279
280以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
281
282| 错误码ID | 错误信息                                   |
283| -------- | -------------------------------------------- |
284| 10200004 | Worker instance is not running.              |
285| 10200005 | The invoked API is not supported in workers. |
286
287**示例:**
288
289```js
290const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
291workerInstance.once("alert", (e)=>{
292    console.log("alert listener callback");
293})
294```
295
296
297### off<sup>9+</sup>
298
299off(type: string, listener?: WorkerEventListener): void
300
301删除类型为type的事件监听,该接口与[removeEventListener<sup>9+</sup>](#removeeventlistener9)接口功能一致。
302
303**系统能力:** SystemCapability.Utils.Lang
304
305**参数:**
306
307| 参数名   | 类型                                         | 必填 | 说明                         |
308| -------- | -------------------------------------------- | ---- | ---------------------------- |
309| type     | string                                       | 是   | 需要删除的事件类型。         |
310| listener | [WorkerEventListener](#workereventlistener9) | 否 | 回调的事件。删除的回调事件。 |
311
312**错误码:**
313
314以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
315
316| 错误码ID | 错误信息                                   |
317| -------- | -------------------------------------------- |
318| 10200004 | Worker instance is not running.              |
319| 10200005 | The invoked API is not supported in workers. |
320
321**示例:**
322
323```js
324const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
325//使用on接口、once接口或addEventListener接口创建“alert”事件,使用off接口删除事件。
326workerInstance.off("alert");
327```
328
329
330### terminate<sup>9+</sup>
331
332terminate(): void
333
334销毁Worker线程,终止Worker接收消息。
335
336**系统能力:** SystemCapability.Utils.Lang
337
338**错误码:**
339
340以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
341
342| 错误码ID | 错误信息                      |
343| -------- | ------------------------------- |
344| 10200004 | Worker instance is not running. |
345
346**示例:**
347
348```js
349const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
350workerInstance.terminate();
351```
352
353
354### onexit<sup>9+</sup>
355
356onexit?: (code: number) =&gt; void
357
358Worker对象的onexit属性表示Worker销毁时被调用的事件处理程序,处理程序在宿主线程中执行。
359
360**系统能力:** SystemCapability.Utils.Lang
361
362**参数:**
363
364| 参数名 | 类型   | 必填 | 说明               |
365| ------ | ------ | ---- | ------------------ |
366| code   | number | 是   | Worker退出的code。 |
367
368**错误码:**
369
370以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
371
372| 错误码ID | 错误信息                                   |
373| -------- | -------------------------------------------- |
374| 10200004 | Worker instance is not running.              |
375| 10200005 | The invoked API is not supported in workers. |
376
377**示例:**
378
379```js
380const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
381workerInstance.onexit = function(e) {
382    console.log("onexit");
383}
384
385//onexit被执行两种方式:
386//主线程:
387workerInstance.terminate();
388
389//worker线程:
390//parentPort.close()
391```
392
393
394### onerror<sup>9+</sup>
395
396onerror?: (err: ErrorEvent) =&gt; void
397
398Worker对象的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在宿主线程中执行。
399
400**系统能力:** SystemCapability.Utils.Lang
401
402**参数:**
403
404| 参数名 | 类型                      | 必填 | 说明       |
405| ------ | ------------------------- | ---- | ---------- |
406| err    | [ErrorEvent](#errorevent) | 是   | 异常数据。 |
407
408**错误码:**
409
410以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
411
412| 错误码ID | 错误信息                                   |
413| -------- | -------------------------------------------- |
414| 10200004 | Worker instance is not running.              |
415| 10200005 | The invoked API is not supported in workers. |
416
417**示例:**
418
419```js
420const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
421workerInstance.onerror = function(e) {
422    console.log("onerror");
423}
424```
425
426
427### onmessage<sup>9+</sup>
428
429onmessage?: (event: MessageEvents) =&gt; void
430
431Worker对象的onmessage属性表示宿主线程接收到来自其创建的Worker通过parentPort.postMessage接口发送的消息时被调用的事件处理程序,处理程序在宿主线程中执行。
432
433**系统能力:** SystemCapability.Utils.Lang
434
435**参数:**
436
437| 参数名 | 类型                             | 必填 | 说明                   |
438| ------ | -------------------------------- | ---- | ---------------------- |
439| event  | [MessageEvents](#messageevents9) | 是   | 收到的Worker消息数据。 |
440
441**错误码:**
442
443以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
444
445| 错误码ID | 错误信息                                   |
446| -------- | -------------------------------------------- |
447| 10200004 | Worker instance is not running.              |
448| 10200005 | The invoked API is not supported in workers. |
449
450**示例:**
451
452```js
453const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
454workerInstance.onmessage = function(e) {
455    // e : MessageEvents, 用法如下:
456    // let data = e.data;
457    console.log("onmessage");
458}
459```
460
461
462### onmessageerror<sup>9+</sup>
463
464onmessageerror?: (event: MessageEvents) =&gt; void
465
466Worker对象的onmessageerror属性表示当Worker对象接收到一条无法被序列化的消息时被调用的事件处理程序,处理程序在宿主线程中执行。
467
468**系统能力:** SystemCapability.Utils.Lang
469
470**参数:**
471
472| 参数名 | 类型                             | 必填 | 说明       |
473| ------ | -------------------------------- | ---- | ---------- |
474| event  | [MessageEvents](#messageevents9) | 是   | 异常数据。 |
475
476**错误码:**
477
478以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
479
480| 错误码ID | 错误信息                                   |
481| -------- | -------------------------------------------- |
482| 10200004 | Worker instance is not running.              |
483| 10200005 | The invoked API is not supported in workers. |
484
485**示例:**
486
487```js
488const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
489workerInstance.onmessageerror= function(e) {
490    console.log("onmessageerror");
491}
492```
493
494### addEventListener<sup>9+</sup>
495
496addEventListener(type: string, listener: WorkerEventListener): void
497
498向Worker添加一个事件监听,该接口与[on<sup>9+</sup>](#on9)接口功能一致。
499
500**系统能力:** SystemCapability.Utils.Lang
501
502**参数:**
503
504| 参数名   | 类型                                         | 必填 | 说明             |
505| -------- | -------------------------------------------- | ---- | ---------------- |
506| type     | string                                       | 是   | 监听的事件类型。 |
507| listener | [WorkerEventListener](#workereventlistener9) | 是   | 回调的事件。     |
508
509**错误码:**
510
511以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
512
513| 错误码ID | 错误信息                                   |
514| -------- | -------------------------------------------- |
515| 10200004 | Worker instance is not running.              |
516| 10200005 | The invoked API is not supported in workers. |
517
518**示例:**
519
520```js
521const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
522workerInstance.addEventListener("alert", (e)=>{
523    console.log("alert listener callback");
524})
525```
526
527
528### removeEventListener<sup>9+</sup>
529
530removeEventListener(type: string, callback?: WorkerEventListener): void
531
532删除Worker的事件监听,该接口与[off<sup>9+</sup>](#off9)接口功能一致。
533
534**系统能力:** SystemCapability.Utils.Lang
535
536**参数:**
537
538| 参数名   | 类型                                         | 必填 | 说明                         |
539| -------- | -------------------------------------------- | ---- | ---------------------------- |
540| type     | string                                       | 是   | 需要删除的监听事件类型。     |
541| callback | [WorkerEventListener](#workereventlistener9) | 否 | 回调的事件。删除的回调事件。 |
542
543**错误码:**
544
545以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
546
547| 错误码ID | 错误信息                      |
548| -------- | ------------------------------- |
549| 10200004 | Worker instance is not running. |
550
551**示例:**
552
553```js
554const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
555workerInstance.addEventListener("alert", (e)=>{
556    console.log("alert listener callback");
557})
558workerInstance.removeEventListener("alert");
559```
560
561
562### dispatchEvent<sup>9+</sup>
563
564dispatchEvent(event: Event): boolean
565
566分发定义在Worker的事件。
567
568**系统能力:** SystemCapability.Utils.Lang
569
570**参数:**
571
572| 参数名 | 类型            | 必填 | 说明             |
573| ------ | --------------- | ---- | ---------------- |
574| event  | [Event](#event) | 是   | 需要分发的事件。 |
575
576**返回值:**
577
578| 类型    | 说明                            |
579| ------- | ------------------------------- |
580| boolean | 分发的结果,false表示分发失败。 |
581
582**错误码:**
583
584以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
585
586| 错误码ID | 错误信息                      |
587| -------- | ------------------------------- |
588| 10200004 | Worker instance is not running. |
589
590**示例:**
591
592```js
593const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
594
595workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。
596```
597
598分发事件(dispatchEvent)可与监听接口(on、once、addEventListener)搭配使用,示例如下:
599
600```js
601const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
602
603//用法一:
604workerInstance.on("alert_on", (e)=>{
605    console.log("alert listener callback");
606})
607workerInstance.once("alert_once", (e)=>{
608    console.log("alert listener callback");
609})
610workerInstance.addEventListener("alert_add", (e)=>{
611    console.log("alert listener callback");
612})
613
614//once接口创建的事件执行一次便会删除。
615workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
616//on接口创建的事件可以一直被分发,不能主动删除。
617workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
618workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
619//addEventListener接口创建的事件可以一直被分发,不能主动删除。
620workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
621workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
622
623//用法二:
624//event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
625//当type = "message",onmessage接口定义的方法同时会执行。
626//当type = "messageerror",onmessageerror接口定义的方法同时会执行。
627//当type = "error",onerror接口定义的方法同时会执行。
628//若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。
629
630workerInstance.addEventListener("message", (e)=>{
631    console.log("message listener callback");
632})
633workerInstance.onmessage = function(e) {
634    console.log("onmessage : message listener callback");
635}
636//调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
637workerInstance.dispatchEvent({type:"message", timeStamp:0});
638```
639
640
641### removeAllListener<sup>9+</sup>
642
643removeAllListener(): void
644
645删除Worker所有的事件监听。
646
647**系统能力:** SystemCapability.Utils.Lang
648
649**错误码:**
650
651以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
652
653| 错误码ID | 错误信息                      |
654| -------- | ------------------------------- |
655| 10200004 | Worker instance is not running. |
656
657**示例:**
658
659```js
660const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
661workerInstance.addEventListener("alert", (e)=>{
662    console.log("alert listener callback");
663})
664workerInstance.removeAllListener();
665```
666
667## WorkerEventTarget<sup>9+</sup>
668
669### addEventListener<sup>9+</sup>
670
671addEventListener(type: string, listener: WorkerEventListener): void
672
673向Worker添加一个事件监听,该接口与[on<sup>9+</sup>](#on9)接口功能一致。
674
675**系统能力:** SystemCapability.Utils.Lang
676
677**参数:**
678
679| 参数名   | 类型                                         | 必填 | 说明             |
680| -------- | -------------------------------------------- | ---- | ---------------- |
681| type     | string                                       | 是   | 监听的事件类型。 |
682| listener | [WorkerEventListener](#workereventlistener9) | 是   | 回调的事件。     |
683
684**错误码:**
685
686以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
687
688| 错误码ID | 错误信息                                   |
689| -------- | -------------------------------------------- |
690| 10200004 | Worker instance is not running.              |
691| 10200005 | The invoked API is not supported in workers. |
692
693**示例:**
694
695```js
696const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
697workerInstance.addEventListener("alert", (e)=>{
698    console.log("alert listener callback");
699})
700```
701
702
703### removeEventListener<sup>9+</sup>
704
705removeEventListener(type: string, callback?: WorkerEventListener): void
706
707删除Worker的事件监听,该接口与[off<sup>9+</sup>](#off9)接口功能一致。
708
709**系统能力:** SystemCapability.Utils.Lang
710
711**参数:**
712
713| 参数名   | 类型                                         | 必填 | 说明                         |
714| -------- | -------------------------------------------- | ---- | ---------------------------- |
715| type     | string                                       | 是   | 需要删除的监听事件类型。     |
716| callback | [WorkerEventListener](#workereventlistener9) | 否 | 回调的事件。删除的回调事件。 |
717
718**错误码:**
719
720以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
721
722| 错误码ID | 错误信息                      |
723| -------- | ------------------------------- |
724| 10200004 | Worker instance is not running. |
725
726**示例:**
727
728```js
729const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
730workerInstance.addEventListener("alert", (e)=>{
731    console.log("alert listener callback");
732})
733workerInstance.removeEventListener("alert");
734```
735
736
737### dispatchEvent<sup>9+</sup>
738
739dispatchEvent(event: Event): boolean
740
741分发定义在Worker的事件。
742
743**系统能力:** SystemCapability.Utils.Lang
744
745**参数:**
746
747| 参数名 | 类型            | 必填 | 说明             |
748| ------ | --------------- | ---- | ---------------- |
749| event  | [Event](#event) | 是   | 需要分发的事件。 |
750
751**返回值:**
752
753| 类型    | 说明                            |
754| ------- | ------------------------------- |
755| boolean | 分发的结果,false表示分发失败。 |
756
757**错误码:**
758
759以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
760
761| 错误码ID | 错误信息                      |
762| -------- | ------------------------------- |
763| 10200004 | Worker instance is not running. |
764
765**示例:**
766
767```js
768const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
769
770workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。
771```
772
773分发事件(dispatchEvent)可与监听接口(on、once、addEventListener)搭配使用,示例如下:
774
775```js
776const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
777
778//用法一:
779workerInstance.on("alert_on", (e)=>{
780    console.log("alert listener callback");
781})
782workerInstance.once("alert_once", (e)=>{
783    console.log("alert listener callback");
784})
785workerInstance.addEventListener("alert_add", (e)=>{
786    console.log("alert listener callback");
787})
788
789//once接口创建的事件执行一次便会删除。
790workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
791//on接口创建的事件可以一直被分发,不能主动删除。
792workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
793workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
794//addEventListener接口创建的事件可以一直被分发,不能主动删除。
795workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
796workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
797
798//用法二:
799//event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
800//当type = "message",onmessage接口定义的方法同时会执行。
801//当type = "messageerror",onmessageerror接口定义的方法同时会执行。
802//当type = "error",onerror接口定义的方法同时会执行。
803//若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。
804
805workerInstance.addEventListener("message", (e)=>{
806    console.log("message listener callback");
807})
808workerInstance.onmessage = function(e) {
809    console.log("onmessage : message listener callback");
810}
811//调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
812workerInstance.dispatchEvent({type:"message", timeStamp:0});
813```
814
815
816### removeAllListener<sup>9+</sup>
817
818removeAllListener(): void
819
820删除Worker所有的事件监听。
821
822**系统能力:** SystemCapability.Utils.Lang
823
824**错误码:**
825
826以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
827
828| 错误码ID | 错误信息                      |
829| -------- | ------------------------------- |
830| 10200004 | Worker instance is not running. |
831
832**示例:**
833
834```js
835const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
836workerInstance.addEventListener("alert", (e)=>{
837    console.log("alert listener callback");
838})
839workerInstance.removeAllListener();
840```
841
842
843## ThreadWorkerGlobalScope<sup>9+</sup>
844
845Worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口销毁Worker线程。ThreadWorkerGlobalScope类继承[GlobalScope<sup>9+</sup>](#globalscope9)。
846
847### postMessage<sup>9+</sup>
848
849postMessage(messageObject: Object, transfer: ArrayBuffer[]): void;
850
851Worker线程向宿主线程发送消息。
852
853**系统能力:** SystemCapability.Utils.Lang
854
855**参数:**
856
857| 参数名   | 类型          | 必填 | 说明                                                    |
858| -------- | ------------- | ---- | ------------------------------------------------------- |
859| message  | Object        | 是   | 发送至宿主线程的数据。                                  |
860| transfer | ArrayBuffer[] | 是   | 可传输对象是ArrayBuffer的实例对象,数组中不可传入null。 |
861
862**错误码:**
863
864以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
865
866| 错误码ID | 错误信息                                |
867| -------- | ----------------------------------------- |
868| 10200004 | Worker instance is not running.           |
869| 10200006 | Serializing an uncaught exception failed. |
870
871**示例:**
872
873```js
874// main.js
875import worker from '@ohos.worker';
876const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
877workerInstance.postMessage("hello world");
878workerInstance.onmessage = function(e) {
879    // let data = e.data;
880    console.log("receive data from worker.js");
881}
882```
883
884```js
885// worker.ts
886import worker from '@ohos.worker';
887const workerPort = worker.workerPort;
888workerPort.onmessage = function(e){
889    // let data = e.data;
890    var buffer = new ArrayBuffer(8);
891    workerPort.postMessage(buffer, [buffer]);
892}
893```
894
895### postMessage<sup>9+</sup>
896
897postMessage(messageObject: Object, options?: PostMessageOptions): void
898
899Worker线程向宿主线程发送消息。
900
901**系统能力:** SystemCapability.Utils.Lang
902
903**参数:**
904
905| 参数名  | 类型                                      | 必填 | 说明                                                         |
906| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
907| message | Object                                    | 是   | 发送至宿主线程的数据。                                       |
908| options | [PostMessageOptions](#postmessageoptions) | 否   | 可传输对象是ArrayBuffer的实例对象。若不填入该参数,默认设置为 undefined。|
909
910**错误码:**
911
912以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
913
914| 错误码ID | 错误信息                                |
915| -------- | ----------------------------------------- |
916| 10200004 | Worker instance is not running.           |
917| 10200006 | Serializing an uncaught exception failed. |
918
919**示例:**
920
921```js
922// main.js
923import worker from '@ohos.worker';
924const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
925workerInstance.postMessage("hello world");
926workerInstance.onmessage = function(e) {
927    // let data = e.data;
928    console.log("receive data from worker.js");
929}
930```
931
932```js
933// worker.ts
934import worker from '@ohos.worker';
935const workerPort = worker.workerPort;
936workerPort.onmessage = function(e){
937    // let data = e.data;
938    workerPort.postMessage("receive data from main.js");
939}
940```
941
942
943### close<sup>9+</sup>
944
945close(): void
946
947销毁Worker线程,终止Worker接收消息。
948
949**系统能力:** SystemCapability.Utils.Lang
950
951**错误码:**
952
953以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
954
955| 错误码ID | 错误信息                      |
956| -------- | ------------------------------- |
957| 10200004 | Worker instance is not running. |
958
959**示例:**
960
961```js
962// main.js
963import worker from '@ohos.worker';
964const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
965```
966
967```js
968// worker.ts
969import worker from '@ohos.worker';
970const workerPort = worker.workerPort;
971workerPort.onmessage = function(e) {
972    workerPort.close()
973}
974```
975
976
977### onmessage<sup>9+</sup>
978
979onmessage?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) =&gt; void
980
981DedicatedWorkerGlobalScope的onmessage属性表示Worker线程收到来自其宿主线程通过postMessage接口发送的消息时被调用的事件处理程序,处理程序在Worker线程中执行。
982
983**系统能力:** SystemCapability.Utils.Lang
984
985**参数:**
986
987| 参数名 | 类型                                                 | 必填 | 说明                     |
988| ------ | ---------------------------------------------------- | ---- | ------------------------ |
989| this   | [ThreadWorkerGlobalScope](#threadworkerglobalscope9) | 是   | 指向调用者对象。         |
990| ev     | [MessageEvents](#messageevents9)                     | 是   | 收到宿主线程发送的数据。 |
991
992**错误码:**
993
994以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
995
996| 错误码ID | 错误信息                                   |
997| -------- | -------------------------------------------- |
998| 10200004 | Worker instance is not running.              |
999| 10200005 | The invoked API is not supported in workers. |
1000
1001**示例:**
1002
1003```js
1004// main.js
1005import worker from '@ohos.worker';
1006const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
1007workerInstance.postMessage("hello world");
1008```
1009
1010```js
1011// worker.ts
1012import worker from '@ohos.worker';
1013const workerPort = worker.workerPort;
1014workerPort.onmessage = function(e) {
1015    console.log("receive main.js message");
1016}
1017```
1018
1019
1020### onmessageerror<sup>9+</sup>
1021
1022onmessageerror?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) =&gt; void
1023
1024DedicatedWorkerGlobalScope的onmessageerror属性表示当Worker对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在Worker线程中执行。
1025
1026**系统能力:** SystemCapability.Utils.Lang
1027
1028**参数:**
1029
1030| 参数名 | 类型                             | 必填 | 说明       |
1031| ------ | -------------------------------- | ---- | ---------- |
1032| this   | [ThreadWorkerGlobalScope](#threadworkerglobalscope9) | 是   | 指向调用者对象。         |
1033| ev     | [MessageEvents](#messageevents9) | 是   | 异常数据。 |
1034
1035**错误码:**
1036
1037以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
1038
1039| 错误码ID | 错误信息                                   |
1040| -------- | -------------------------------------------- |
1041| 10200004 | Worker instance is not running.              |
1042| 10200005 | The invoked API is not supported in workers. |
1043
1044**示例:**
1045
1046```js
1047// main.js
1048import worker from '@ohos.worker';
1049const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
1050```
1051
1052```js
1053// worker.ts
1054import worker from '@ohos.worker';
1055const parentPort = worker.workerPort;
1056parentPort.onmessageerror = function(e) {
1057    console.log("worker.js onmessageerror")
1058}
1059```
1060
1061
1062## WorkerEventListener<sup>9+</sup>
1063
1064(event: Event): void | Promise&lt;void&gt;
1065
1066事件监听类。
1067
1068**系统能力:** SystemCapability.Utils.Lang
1069
1070**参数:**
1071
1072| 参数名 | 类型            | 必填 | 说明           |
1073| ------ | --------------- | ---- | -------------- |
1074| event  | [Event](#event) | 是   | 回调的事件类。 |
1075
1076**返回值:**
1077
1078| 类型                                  | 说明                            |
1079| ------------------------------------- | ------------------------------- |
1080| void&nbsp;\|&nbsp;Promise&lt;void&gt; | 无返回值或者以Promise形式返回。 |
1081
1082**错误码:**
1083
1084以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。
1085
1086| 错误码ID | 错误信息                                   |
1087| -------- | -------------------------------------------- |
1088| 10200004 | Worker instance is not running.              |
1089| 10200005 | The invoked API is not supported in workers. |
1090
1091**示例:**
1092
1093```js
1094const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
1095workerInstance.addEventListener("alert", (e)=>{
1096    console.log("alert listener callback");
1097})
1098```
1099
1100
1101## GlobalScope<sup>9+</sup>
1102
1103Worker线程自身的运行环境,GlobalScope类继承[WorkerEventTarget](#workereventtarget9)。
1104
1105### 属性
1106
1107**系统能力:** SystemCapability.Utils.Lang
1108
1109| 名称 | 类型                                                         | 可读 | 可写 | 说明                                  |
1110| ---- | ------------------------------------------------------------ | ---- | ---- | ------------------------------------- |
1111| name | string                                                       | 是   | 否   | Worker的名字,new&nbsp;Worker时指定。 |
1112| self | [GlobalScope](#globalscope9)&nbsp;&amp;&nbsp;typeof&nbsp;globalThis | 是   | 否   | GlobalScope本身。                     |
1113
1114
1115### onerror<sup>9+</sup>
1116
1117onerror?: (ev: ErrorEvent) =&gt; void
1118
1119GlobalScope的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在Worker线程中执行。
1120
1121**系统能力:** SystemCapability.Utils.Lang
1122
1123**参数:**
1124
1125| 参数名 | 类型                      | 必填 | 说明       |
1126| ------ | ------------------------- | ---- | ---------- |
1127| ev     | [ErrorEvent](#errorevent) | 是   | 异常数据。 |
1128
1129**示例:**
1130
1131```js
1132// main.js
1133import worker from '@ohos.worker';
1134const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts")
1135```
1136
1137```js
1138// worker.ts
1139import worker from '@ohos.worker';
1140const workerPort = worker.workerPort
1141workerPort.onerror = function(e){
1142    console.log("worker.js onerror")
1143}
1144```
1145
1146## MessageEvents<sup>9+</sup>
1147
1148消息类,持有Worker线程间传递的数据。
1149
1150**系统能力:** SystemCapability.Utils.Lang
1151
1152| 名称 | 类型 | 可读 | 可写 | 说明               |
1153| ---- | ---- | ---- | ---- | ------------------ |
1154| data | any  | 是   | 否   | 线程间传递的数据。 |
1155
1156## Worker<sup>(deprecated)</sup>
1157
1158
1159使用以下方法前,均需先构造Worker实例,Worker类继承[EventTarget](#eventtarget)。
1160
1161> **说明:**<br/>
1162> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker<sup>9+</sup>](#threadworker9)替代。
1163
1164### constructor<sup>(deprecated)</sup>
1165
1166constructor(scriptURL: string, options?: WorkerOptions)
1167
1168Worker构造函数。
1169
1170> **说明:**<br/>
1171> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.constructor<sup>9+</sup>](#constructor9)替代。
1172
1173**系统能力:** SystemCapability.Utils.Lang
1174
1175**参数:**
1176
1177| 参数名    | 类型                            | 必填 | 说明                                                         |
1178| --------- | ------------------------------- | ---- | ------------------------------------------------------------ |
1179| scriptURL | string                          | 是   | Worker执行脚本的路径。<br/>在FA和Stage模型下,DevEco Studio新建Worker工程路径分别存在以下两种情况:<br/>(a) worker脚本所在目录与pages目录同级。<br/>(b) worker脚本所在目录与pages目录不同级。 |
1180| options   | [WorkerOptions](#workeroptions) | 否   | Worker构造的选项。                                           |
1181
1182**返回值:**
1183
1184| 类型   | 说明                                                      |
1185| ------ | --------------------------------------------------------- |
1186| Worker | 执行Worker构造函数生成的Worker对象,失败则返回undefined。 |
1187
1188**示例:**
1189
1190```js
1191import worker from '@ohos.worker';
1192// worker线程创建
1193
1194// FA模型-目录同级
1195const workerFAModel01 = new worker.Worker("workers/worker.js", {name:"first worker in FA model"});
1196// FA模型-目录不同级(以workers目录放置pages目录前一级为例)
1197const workerFAModel02 = new worker.Worker("../workers/worker.js");
1198
1199// Stage模型-目录同级
1200const workerStageModel01 = new worker.Worker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
1201// Stage模型-目录不同级(以workers目录放置pages目录后一级为例)
1202const workerStageModel02 = new worker.Worker('entry/ets/pages/workers/worker.ts');
1203
1204// 理解Stage模型scriptURL的"entry/ets/workers/worker.ts":
1205// entry: 为module.json5文件中module的name属性对应的值;
1206// ets: 表明当前使用的语言。
1207```
1208同时,需在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息,主要分为下面两种情况:
1209
1210(1) 目录同级
1211
1212FA模型:
1213
1214```json
1215  "buildOption": {
1216    "sourceOption": {
1217      "workers": [
1218        "./src/main/ets/MainAbility/workers/worker.ts"
1219      ]
1220    }
1221  }
1222```
1223Stage模型:
1224```json
1225  "buildOption": {
1226    "sourceOption": {
1227      "workers": [
1228        "./src/main/ets/workers/worker.ts"
1229      ]
1230    }
1231  }
1232```
1233(2) 目录不同级
1234
1235FA模型:
1236```json
1237  "buildOption": {
1238    "sourceOption": {
1239      "workers": [
1240        "./src/main/ets/workers/worker.ts"
1241      ]
1242    }
1243  }
1244```
1245Stage模型:
1246```json
1247  "buildOption": {
1248    "sourceOption": {
1249      "workers": [
1250        "./src/main/ets/pages/workers/worker.ts"
1251      ]
1252    }
1253  }
1254```
1255
1256### postMessage<sup>(deprecated)</sup>
1257
1258postMessage(message: Object, transfer: ArrayBuffer[]): void;
1259
1260向Worker线程发送数据,数据类型必须是序列化所支持的类型。序列化支持类型见其他说明。
1261
1262> **说明:**<br/>
1263> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.postMessage<sup>9+</sup>](#postmessage9)替代。
1264
1265**系统能力:** SystemCapability.Utils.Lang
1266
1267**参数:**
1268
1269| 参数名   | 类型          | 必填 | 说明                                            |
1270| -------- | ------------- | ---- | ----------------------------------------------- |
1271| message  | Object        | 是   | 发送至Worker的数据。                            |
1272| transfer | ArrayBuffer[] | 是   | 可转移对象是&nbsp;ArrayBuffer&nbsp;的实例对象。 |
1273
1274**示例:**
1275
1276```js
1277const workerInstance = new worker.Worker("workers/worker.js");
1278
1279var buffer = new ArrayBuffer(8);
1280workerInstance.postMessage(buffer, [buffer]);
1281```
1282
1283### postMessage<sup>(deprecated)</sup>
1284
1285postMessage(message: Object, options?: PostMessageOptions): void
1286
1287向Worker线程发送数据,数据类型必须是序列化所支持的类型。序列化支持类型见其他说明。
1288
1289> **说明:**<br/>
1290> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.postMessage<sup>9+</sup>](#postmessage9-1)替代。
1291
1292**系统能力:** SystemCapability.Utils.Lang
1293
1294**参数:**
1295
1296| 参数名  | 类型                                      | 必填 | 说明                                                         |
1297| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
1298| message | Object                                    | 是   | 发送至Worker的数据。                                         |
1299| options | [PostMessageOptions](#postmessageoptions) | 否   | 可传输对象是&nbsp;ArrayBuffer&nbsp;的实例对象。若不填入该参数,默认设置为 undefined。|
1300
1301**示例:**
1302
1303```js
1304const workerInstance = new worker.Worker("workers/worker.js");
1305
1306workerInstance.postMessage("hello world");
1307
1308var buffer = new ArrayBuffer(8);
1309workerInstance.postMessage(buffer, [buffer]);
1310```
1311
1312
1313### on<sup>(deprecated)</sup>
1314
1315on(type: string, listener: EventListener): void
1316
1317向Worker添加一个事件监听,该接口与[addEventListener<sup>(deprecated)</sup>](#addeventlistenerdeprecated)接口功能一致。
1318
1319> **说明:**<br/>
1320> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.on<sup>9+</sup>](#on9)替代。
1321
1322**系统能力:** SystemCapability.Utils.Lang
1323
1324**参数:**
1325
1326| 参数名   | 类型                            | 必填 | 说明             |
1327| -------- | ------------------------------- | ---- | ---------------- |
1328| type     | string                          | 是   | 监听的事件类型。 |
1329| listener | [EventListener](#eventlistener) | 是   | 回调事件。       |
1330
1331**示例:**
1332
1333```js
1334const workerInstance = new worker.Worker("workers/worker.js");
1335workerInstance.on("alert", (e)=>{
1336    console.log("alert listener callback");
1337})
1338```
1339
1340
1341### once<sup>(deprecated)</sup>
1342
1343once(type: string, listener: EventListener): void
1344
1345向Worker添加一个事件监听,事件监听只执行一次便自动删除。
1346
1347> **说明:**<br/>
1348> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.once<sup>9+</sup>](#once9)替代。
1349
1350**系统能力:** SystemCapability.Utils.Lang
1351
1352**参数:**
1353
1354| 参数名   | 类型                            | 必填 | 说明             |
1355| -------- | ------------------------------- | ---- | ---------------- |
1356| type     | string                          | 是   | 监听的事件类型。 |
1357| listener | [EventListener](#eventlistener) | 是   | 回调事件。       |
1358
1359**示例:**
1360
1361```js
1362const workerInstance = new worker.Worker("workers/worker.js");
1363workerInstance.once("alert", (e)=>{
1364    console.log("alert listener callback");
1365})
1366```
1367
1368
1369### off<sup>(deprecated)</sup>
1370
1371off(type: string, listener?: EventListener): void
1372
1373删除类型为type的事件监听,该接口与[removeEventListener<sup>(deprecated)</sup>](#removeeventlistenerdeprecated)接口功能一致。
1374
1375> **说明:**<br/>
1376> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.off<sup>9+</sup>](#off9)替代。
1377
1378**系统能力:** SystemCapability.Utils.Lang
1379
1380**参数:**
1381
1382| 参数名   | 类型                            | 必填 | 说明                 |
1383| -------- | ------------------------------- | ---- | -------------------- |
1384| type     | string                          | 是   | 需要删除的事件类型。 |
1385| listener | [EventListener](#eventlistener) | 否   | 删除的回调事件。     |
1386
1387**示例:**
1388
1389```js
1390const workerInstance = new worker.Worker("workers/worker.js");
1391//使用on接口、once接口或addEventListener接口创建“alert”事件,使用off接口删除事件。
1392workerInstance.off("alert");
1393```
1394
1395
1396### terminate<sup>(deprecated)</sup>
1397
1398terminate(): void
1399
1400销毁Worker线程,终止Worker接收消息。
1401
1402> **说明:**<br/>
1403> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.terminate<sup>9+</sup>](#terminate9)替代。
1404
1405**系统能力:** SystemCapability.Utils.Lang
1406
1407**示例:**
1408
1409```js
1410const workerInstance = new worker.Worker("workers/worker.js");
1411workerInstance.terminate();
1412```
1413
1414
1415### onexit<sup>(deprecated)</sup>
1416
1417onexit?: (code: number) =&gt; void
1418
1419Worker对象的onexit属性表示Worker销毁时被调用的事件处理程序,处理程序在宿主线程中执行。
1420
1421> **说明:**<br/>
1422> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.onexit<sup>9+</sup>](#onexit9)替代。
1423
1424**系统能力:** SystemCapability.Utils.Lang
1425
1426**参数:**
1427
1428| 参数名 | 类型   | 必填 | 说明               |
1429| ------ | ------ | ---- | ------------------ |
1430| code   | number | 是   | Worker退出的code。 |
1431
1432**示例:**
1433
1434```js
1435const workerInstance = new worker.Worker("workers/worker.js");
1436workerInstance.onexit = function(e) {
1437    console.log("onexit");
1438}
1439
1440//onexit被执行两种方式:
1441//主线程:
1442workerInstance.terminate();
1443
1444//worker线程:
1445//parentPort.close()
1446```
1447
1448
1449### onerror<sup>(deprecated)</sup>
1450
1451onerror?: (err: ErrorEvent) =&gt; void
1452
1453Worker对象的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在宿主线程中执行。
1454
1455> **说明:**<br/>
1456> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.onerror<sup>9+</sup>](#onerror9)替代。
1457
1458**系统能力:** SystemCapability.Utils.Lang
1459
1460**参数:**
1461
1462| 参数名 | 类型                      | 必填 | 说明       |
1463| ------ | ------------------------- | ---- | ---------- |
1464| err    | [ErrorEvent](#errorevent) | 是   | 异常数据。 |
1465
1466**示例:**
1467
1468```js
1469const workerInstance = new worker.Worker("workers/worker.js");
1470workerInstance.onerror = function(e) {
1471    console.log("onerror");
1472}
1473```
1474
1475
1476### onmessage<sup>(deprecated)</sup>
1477
1478onmessage?: (event: MessageEvent) =&gt; void
1479
1480Worker对象的onmessage属性表示宿主线程接收到来自其创建的Worker通过parentPort.postMessage接口发送的消息时被调用的事件处理程序,处理程序在宿主线程中执行。
1481
1482> **说明:**<br/>
1483> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.onmessage<sup>9+</sup>](#onmessage9)替代。
1484
1485**系统能力:** SystemCapability.Utils.Lang
1486
1487**参数:**
1488
1489| 参数名 | 类型                           | 必填 | 说明                   |
1490| ------ | ------------------------------ | ---- | ---------------------- |
1491| event  | [MessageEvent](#messageeventt) | 是   | 收到的Worker消息数据。 |
1492
1493**示例:**
1494
1495```js
1496const workerInstance = new worker.Worker("workers/worker.js");
1497workerInstance.onmessage = function(e) {
1498    // e : MessageEvent, 用法如下:
1499    // let data = e.data;
1500    console.log("onmessage");
1501}
1502```
1503
1504
1505### onmessageerror<sup>(deprecated)</sup>
1506
1507onmessageerror?: (event: MessageEvent) =&gt; void
1508
1509Worker对象的onmessageerror属性表示当Worker对象接收到一条无法被序列化的消息时被调用的事件处理程序,处理程序在宿主线程中执行。
1510
1511> **说明:**<br/>
1512> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.onmessageerror<sup>9+</sup>](#onmessageerror9)替代。
1513
1514**系统能力:** SystemCapability.Utils.Lang
1515
1516**参数:**
1517
1518| 参数名 | 类型                           | 必填 | 说明       |
1519| ------ | ------------------------------ | ---- | ---------- |
1520| event  | [MessageEvent](#messageeventt) | 是   | 异常数据。 |
1521
1522**示例:**
1523
1524```js
1525const workerInstance = new worker.Worker("workers/worker.js");
1526workerInstance.onmessageerror= function(e) {
1527    console.log("onmessageerror");
1528}
1529```
1530
1531
1532## EventTarget<sup>(deprecated)</sup>
1533> **说明:**<br/>
1534> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[WorkerEventTarget<sup>9+</sup>](#workereventtarget9)替代。
1535
1536### addEventListener<sup>(deprecated)</sup>
1537
1538addEventListener(type: string, listener: EventListener): void
1539
1540向Worker添加一个事件监听,该接口与[on<sup>(deprecated)</sup>](#ondeprecated)接口功能一致。
1541
1542> **说明:**<br/>
1543> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[addEventListener<sup>9+</sup>](#addeventlistener9)替代。
1544
1545**系统能力:** SystemCapability.Utils.Lang
1546
1547**参数:**
1548
1549| 参数名   | 类型                            | 必填 | 说明             |
1550| -------- | ------------------------------- | ---- | ---------------- |
1551| type     | string                          | 是   | 监听的事件类型。 |
1552| listener | [EventListener](#eventlistener) | 是   | 回调的事件。     |
1553
1554**示例:**
1555
1556```js
1557const workerInstance = new worker.Worker("workers/worker.js");
1558workerInstance.addEventListener("alert", (e)=>{
1559    console.log("alert listener callback");
1560})
1561```
1562
1563
1564### removeEventListener<sup>(deprecated)</sup>
1565
1566removeEventListener(type: string, callback?: EventListener): void
1567
1568删除Worker的事件监听,该接口与[off<sup>(deprecated)</sup>](#offdeprecated)接口功能一致。
1569
1570> **说明:**<br/>
1571> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[removeEventListener<sup>9+</sup>](#removeeventlistener9)替代。
1572
1573**系统能力:** SystemCapability.Utils.Lang
1574
1575**参数:**
1576
1577| 参数名   | 类型                            | 必填 | 说明                     |
1578| -------- | ------------------------------- | ---- | ------------------------ |
1579| type     | string                          | 是   | 需要删除的监听事件类型。 |
1580| callback | [EventListener](#eventlistener) | 否   | 删除的回调事件。         |
1581
1582**示例:**
1583
1584```js
1585const workerInstance = new worker.Worker("workers/worker.js");
1586workerInstance.addEventListener("alert", (e)=>{
1587    console.log("alert listener callback");
1588})
1589workerInstance.removeEventListener("alert");
1590```
1591
1592
1593### dispatchEvent<sup>(deprecated)</sup>
1594
1595dispatchEvent(event: Event): boolean
1596
1597分发定义在Worker的事件。
1598
1599> **说明:**<br/>
1600> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[dispatchEvent<sup>9+</sup>](#dispatchevent9)替代。
1601
1602**系统能力:** SystemCapability.Utils.Lang
1603
1604**参数:**
1605
1606| 参数名 | 类型            | 必填 | 说明             |
1607| ------ | --------------- | ---- | ---------------- |
1608| event  | [Event](#event) | 是   | 需要分发的事件。 |
1609
1610**返回值:**
1611
1612| 类型    | 说明                            |
1613| ------- | ------------------------------- |
1614| boolean | 分发的结果,false表示分发失败。 |
1615
1616**示例:**
1617
1618```js
1619const workerInstance = new worker.Worker("workers/worker.js");
1620
1621workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。
1622```
1623
1624分发事件(dispatchEvent)可与监听接口(on、once、addEventListener)搭配使用,示例如下:
1625
1626```js
1627const workerInstance = new worker.Worker("workers/worker.js");
1628
1629//用法一:
1630workerInstance.on("alert_on", (e)=>{
1631    console.log("alert listener callback");
1632})
1633workerInstance.once("alert_once", (e)=>{
1634    console.log("alert listener callback");
1635})
1636workerInstance.addEventListener("alert_add", (e)=>{
1637    console.log("alert listener callback");
1638})
1639
1640//once接口创建的事件执行一次便会删除。
1641workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
1642//on接口创建的事件可以一直被分发,不能主动删除。
1643workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
1644workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
1645//addEventListener接口创建的事件可以一直被分发,不能主动删除。
1646workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
1647workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
1648
1649//用法二:
1650//event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
1651//当type = "message",onmessage接口定义的方法同时会执行。
1652//当type = "messageerror",onmessageerror接口定义的方法同时会执行。
1653//当type = "error",onerror接口定义的方法同时会执行。
1654//若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。
1655
1656workerInstance.addEventListener("message", (e)=>{
1657    console.log("message listener callback");
1658})
1659workerInstance.onmessage = function(e) {
1660    console.log("onmessage : message listener callback");
1661}
1662//调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
1663workerInstance.dispatchEvent({type:"message", timeStamp:0});
1664```
1665### removeAllListener<sup>(deprecated)</sup>
1666
1667removeAllListener(): void
1668
1669删除Worker所有的事件监听。
1670
1671> **说明:**<br/>
1672> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[removeAllListener<sup>9+</sup>](#removealllistener9)替代。
1673
1674**系统能力:** SystemCapability.Utils.Lang
1675
1676**示例:**
1677
1678```js
1679const workerInstance = new worker.Worker("workers/worker.js");
1680workerInstance.addEventListener("alert", (e)=>{
1681    console.log("alert listener callback");
1682})
1683workerInstance.removeAllListener();
1684```
1685
1686
1687## DedicatedWorkerGlobalScope<sup>(deprecated)</sup>
1688
1689Worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口销毁Worker线程。DedicatedWorkerGlobalScope类继承[WorkerGlobalScope](#workerglobalscope)。
1690
1691> **说明:**<br/>
1692> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>](#threadworkerglobalscope9)替代。
1693
1694### postMessage<sup>(deprecated)</sup>
1695
1696postMessage(messageObject: Object, transfer: Transferable[]): void;
1697
1698Worker线程向宿主线程发送消息。
1699
1700> **说明:**<br/>
1701> 此接口暂不支持使用,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.postMessage<sup>9+</sup>](#postmessage9-2)替代。
1702
1703**系统能力:** SystemCapability.Utils.Lang
1704
1705**参数:**
1706
1707| 参数名  | 类型                                      | 必填 | 说明                                                         |
1708| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
1709| messageObject | Object                                    | 是   | 发送至宿主线程的数据。                                       |
1710| transfer| Transferable[]                            | 是   | 暂不支持该参数类型。                                         |
1711
1712### postMessage<sup>9+</sup>
1713
1714postMessage(messageObject: Object, transfer: ArrayBuffer[]): void;
1715
1716Worker线程向宿主线程发送消息。
1717
1718> **说明:**<br/>
1719> DedicatedWorkerGlobalScope类自API version 9 开始废弃,本接口建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.postMessage<sup>9+</sup>](#postmessage9-2)替代。
1720
1721**系统能力:** SystemCapability.Utils.Lang
1722
1723**参数:**
1724
1725| 参数名   | 类型          | 必填 | 说明                                                  |
1726| -------- | ------------- | ---- | ----------------------------------------------------- |
1727| message  | Object        | 是   | 发送至宿主线程的数据。                                |
1728| transfer | ArrayBuffer[] | 是   | 可传输对象是ArrayBuffer的实例对象,数组不可传入null。 |
1729
1730**示例:**
1731
1732```js
1733// main.js
1734import worker from '@ohos.worker';
1735const workerInstance = new worker.Worker("workers/worker.js");
1736workerInstance.postMessage("hello world");
1737workerInstance.onmessage = function(e) {
1738    // let data = e.data;
1739    console.log("receive data from worker.js");
1740}
1741```
1742```js
1743// worker.js
1744import worker from '@ohos.worker';
1745const parentPort = worker.parentPort;
1746parentPort.onmessage = function(e){
1747    // let data = e.data;
1748    let buffer = new ArrayBuffer(5)
1749    parentPort.postMessage(buffer, [buffer]);
1750}
1751```
1752
1753### postMessage<sup>(deprecated)</sup>
1754
1755postMessage(messageObject: Object, options?: PostMessageOptions): void
1756
1757Worker线程向宿主线程发送消息。
1758
1759> **说明:**<br/>
1760> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.postMessage<sup>9+</sup>](#postmessage9-3)替代。
1761
1762**系统能力:** SystemCapability.Utils.Lang
1763
1764**参数:**
1765
1766| 参数名  | 类型                                      | 必填 | 说明                                                         |
1767| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
1768| message | Object                                    | 是   | 发送至宿主线程的数据。                                       |
1769| options | [PostMessageOptions](#postmessageoptions) | 否   | 可传输对象是ArrayBuffer的实例对象。若不填入该参数,默认设置为 undefined。|
1770
1771**示例:**
1772
1773```js
1774// main.js
1775import worker from '@ohos.worker';
1776const workerInstance = new worker.Worker("workers/worker.js");
1777workerInstance.postMessage("hello world");
1778workerInstance.onmessage = function(e) {
1779    // let data = e.data;
1780    console.log("receive data from worker.js");
1781}
1782```
1783```js
1784// worker.js
1785import worker from '@ohos.worker';
1786const parentPort = worker.parentPort;
1787parentPort.onmessage = function(e){
1788    // let data = e.data;
1789    parentPort.postMessage("receive data from main.js");
1790}
1791```
1792
1793### close<sup>(deprecated)</sup>
1794
1795close(): void
1796
1797销毁Worker线程,终止Worker接收消息。
1798
1799> **说明:**<br/>
1800> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.close<sup>9+</sup>](#close9)替代。
1801
1802**系统能力:** SystemCapability.Utils.Lang
1803
1804**示例:**
1805
1806```js
1807// main.js
1808import worker from '@ohos.worker';
1809const workerInstance = new worker.Worker("workers/worker.js");
1810```
1811```js
1812// worker.js
1813import worker from '@ohos.worker';
1814const parentPort = worker.parentPort;
1815parentPort.onmessage = function(e) {
1816    parentPort.close()
1817}
1818```
1819
1820
1821### onmessage<sup>(deprecated)</sup>
1822
1823onmessage?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) =&gt; void
1824
1825DedicatedWorkerGlobalScope的onmessage属性表示Worker线程收到来自其宿主线程通过postMessage接口发送的消息时被调用的事件处理程序,处理程序在Worker线程中执行。
1826
1827> **说明:**<br/>
1828> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.onmessage<sup>9+</sup>](#onmessage9-1)替代。
1829
1830**系统能力:** SystemCapability.Utils.Lang
1831
1832**参数:**
1833
1834| 参数名 | 类型                                                         | 必填 | 说明                     |
1835| ------ | ------------------------------------------------------------ | ---- | ------------------------ |
1836| this   | [DedicatedWorkerGlobalScope](#dedicatedworkerglobalscopedeprecated) | 是   | 指向调用者对象。         |
1837| ev     | [MessageEvent](#messageeventt)                               | 是   | 收到宿主线程发送的数据。 |
1838
1839**示例:**
1840
1841```js
1842// main.js
1843import worker from '@ohos.worker';
1844const workerInstance = new worker.Worker("workers/worker.js");
1845workerInstance.postMessage("hello world");
1846```
1847```js
1848// worker.js
1849import worker from '@ohos.worker';
1850const parentPort = worker.parentPort;
1851parentPort.onmessage = function(e) {
1852    console.log("receive main.js message");
1853}
1854```
1855
1856
1857### onmessageerror<sup>(deprecated)</sup>
1858
1859onmessageerror?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) =&gt; void
1860
1861DedicatedWorkerGlobalScope的onmessageerror属性表示当Worker对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在Worker线程中执行。
1862
1863> **说明:**<br/>
1864> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.onmessageerror<sup>9+</sup>](#onmessageerror9-1)替代。
1865
1866**系统能力:** SystemCapability.Utils.Lang
1867
1868**参数:**
1869
1870| 参数名 | 类型                           | 必填 | 说明       |
1871| ------ | ------------------------------ | ---- | ---------- |
1872| this   | [DedicatedWorkerGlobalScope](#dedicatedworkerglobalscopedeprecated) | 是   | 指向调用者对象。 |
1873| ev     | [MessageEvent](#messageeventt) | 是   | 异常数据。 |
1874
1875**示例:**
1876
1877```js
1878// main.js
1879import worker from '@ohos.worker';
1880const workerInstance = new worker.Worker("workers/worker.js");
1881```
1882```js
1883// worker.js
1884import worker from '@ohos.worker';
1885const parentPort = worker.parentPort;
1886parentPort.onmessageerror = function(e) {
1887    console.log("worker.js onmessageerror")
1888}
1889```
1890
1891
1892## PostMessageOptions
1893
1894明确数据传递过程中需要转移所有权对象的类,传递所有权的对象必须是ArrayBuffer。
1895
1896**系统能力:** SystemCapability.Utils.Lang
1897
1898| 名称     | 类型     | 可读 | 可写 | 说明                              |
1899| -------- | -------- | ---- | ---- | --------------------------------- |
1900| transfer | Object[] | 是   | 是   | ArrayBuffer数组,用于传递所有权。该数组中不可传入null。 |
1901
1902
1903## Event
1904
1905事件类。
1906
1907**系统能力:** SystemCapability.Utils.Lang
1908
1909| 名称      | 类型   | 可读 | 可写 | 说明                                         |
1910| --------- | ------ | ---- | ---- | -------------------------------------------- |
1911| type      | string | 是   | 否   | 指定事件的类型。                             |
1912| timeStamp | number | 是   | 否   | 事件创建时的时间戳(精度为毫秒),暂未支持。 |
1913
1914
1915## EventListener<sup>(deprecated)</sup>
1916
1917(evt: Event): void | Promise&lt;void&gt;
1918
1919事件监听类。
1920
1921> **说明:**<br/>
1922> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[WorkerEventListener<sup>9+</sup>](#workereventlistener9)替代。
1923
1924**系统能力:** SystemCapability.Utils.Lang
1925
1926**参数:**
1927
1928| 参数名 | 类型            | 必填 | 说明           |
1929| ------ | --------------- | ---- | -------------- |
1930| evt    | [Event](#event) | 是   | 回调的事件类。 |
1931
1932**返回值:**
1933
1934| 类型                                  | 说明                            |
1935| ------------------------------------- | ------------------------------- |
1936| void&nbsp;\|&nbsp;Promise&lt;void&gt; | 无返回值或者以Promise形式返回。 |
1937
1938**示例:**
1939
1940```js
1941const workerInstance = new worker.Worker("workers/worker.js");
1942workerInstance.addEventListener("alert", (e)=>{
1943    console.log("alert listener callback");
1944})
1945```
1946
1947
1948## ErrorEvent
1949
1950错误事件类,用于表示Worker执行过程中出现异常的详细信息,ErrorEvent类继承[Event](#event)。
1951
1952**系统能力:** SystemCapability.Utils.Lang
1953
1954| 名称     | 类型   | 可读 | 可写 | 说明                 |
1955| -------- | ------ | ---- | ---- | -------------------- |
1956| message  | string | 是   | 否   | 异常发生的错误信息。 |
1957| filename | string | 是   | 否   | 出现异常所在的文件。 |
1958| lineno   | number | 是   | 否   | 异常所在的行数。     |
1959| colno    | number | 是   | 否   | 异常所在的列数。     |
1960| error    | Object | 是   | 否   | 异常类型。           |
1961
1962
1963## MessageEvent\<T\>
1964
1965消息类,持有Worker线程间传递的数据。
1966
1967**系统能力:** SystemCapability.Utils.Lang
1968
1969| 名称 | 类型 | 可读 | 可写 | 说明               |
1970| ---- | ---- | ---- | ---- | ------------------ |
1971| data | T    | 是   | 否   | 线程间传递的数据。 |
1972
1973
1974## WorkerGlobalScope<sup>(deprecated)</sup>
1975
1976Worker线程自身的运行环境,WorkerGlobalScope类继承[EventTarget](#eventtarget)。
1977
1978> **说明:**<br/>
1979> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[GlobalScope<sup>9+</sup>](#globalscope9)替代。
1980
1981### 属性
1982
1983**系统能力:** SystemCapability.Utils.Lang
1984
1985| 名称 | 类型                                                         | 可读 | 可写 | 说明                                  |
1986| ---- | ------------------------------------------------------------ | ---- | ---- | ------------------------------------- |
1987| name | string                                                       | 是   | 否   | Worker的名字,new&nbsp;Worker时指定。 |
1988| self | [WorkerGlobalScope](#workerglobalscope)&nbsp;&amp;&nbsp;typeof&nbsp;globalThis | 是   | 否   | WorkerGlobalScope本身。               |
1989
1990
1991### onerror<sup>(deprecated)</sup>
1992
1993onerror?: (ev: ErrorEvent) =&gt; void
1994
1995WorkerGlobalScope的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在Worker线程中执行。
1996
1997> **说明:**<br/>
1998> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[GlobalScope<sup>9+</sup>.onerror<sup>9+</sup>](#onerror9-1)替代。
1999
2000**系统能力:** SystemCapability.Utils.Lang
2001
2002**参数:**
2003
2004| 参数名 | 类型                      | 必填 | 说明       |
2005| ------ | ------------------------- | ---- | ---------- |
2006| ev     | [ErrorEvent](#errorevent) | 是   | 异常数据。 |
2007
2008**示例:**
2009
2010```js
2011// main.js
2012import worker from '@ohos.worker';
2013const workerInstance = new worker.Worker("workers/worker.js")
2014```
2015```js
2016// worker.js
2017import worker from '@ohos.worker';
2018const parentPort = worker.parentPort
2019parentPort.onerror = function(e){
2020    console.log("worker.js onerror")
2021}
2022```
2023
2024
2025## 其他说明
2026
2027### 序列化支持类型
2028| Type               | 备注                                   | 是否支持 |
2029| ------------------ | -------------------------------------- | -------- |
2030| All Primitive Type | 不包括symbol                           | 是       |
2031| Date               |                                        | 是       |
2032| String             |                                        | 是       |
2033| RegExp             |                                        | 是       |
2034| Array              |                                        | 是       |
2035| Map                |                                        | 是       |
2036| Set                |                                        | 是       |
2037| Object             | 只支持Plain Object,不支持带function的 | 是       |
2038| ArrayBuffer        | 提供transfer能力                       | 是       |
2039| TypedArray         |                                        | 是       |
2040
2041特例:传递通过自定义class创建出来的object时,不会发生序列化错误,但是自定义class的属性(如Function)无法通过序列化传递。
2042> **说明:**<br/>
2043> 以API version 9的FA工程为例。
2044
2045```js
2046// main.js
2047import worker from '@ohos.worker';
2048const workerInstance = new worker.ThreadWorker("workers/worker.js");
2049workerInstance.postMessage("message from main to worker");
2050workerInstance.onmessage = function(d) {
2051  // 当worker线程传递obj2时,data即为obj2。data没有Init、SetName的方法
2052  let data = d.data;
2053}
2054```
2055```js
2056// worker.js
2057import worker from '@ohos.worker';
2058const workerPort = worker.workerPort;
2059class MyModel {
2060    name = "undefined"
2061    Init() {
2062        this.name = "MyModel"
2063    }
2064}
2065workerPort.onmessage = function(d) {
2066    console.log("worker.js onmessage");
2067    let data = d.data;
2068    let func1 = function() {
2069        console.log("post message is function");
2070    }
2071    let obj1 = {
2072        "index": 2,
2073        "name1": "zhangshan",
2074        setName() {
2075            this.index = 3;
2076        }
2077    }
2078    let obj2 = new MyModel();
2079    // workerPort.postMessage(func1); 传递func1发生序列化错误
2080    // workerPort.postMessage(obj1);  传递obj1发生序列化错误
2081    workerPort.postMessage(obj2);     // 传递obj2不会发生序列化错误
2082}
2083workerPort.onmessageerror = function(e) {
2084    console.log("worker.js onmessageerror");
2085}
2086workerPort.onerror = function(e) {
2087    console.log("worker.js onerror");
2088}
2089```
2090
2091### 内存模型
2092Worker基于Actor并发模型实现。在Worker的交互流程中,JS主线程可以创建多个Worker子线程,各个Worker线程间相互隔离,并通过序列化传递对象,等到Worker线程完成计算任务,再把结果返回给主线程。
2093
2094Actor并发模型的交互原理:各个Actor并发地处理主线程任务,每个Actor内部都有一个消息队列及单线程执行模块,消息队列负责接收主线程及其他Actor的请求,单线程执行模块则负责串行地处理请求、向其他Actor发送请求以及创建新的Actor。由于Actor采用的是异步方式,各个Actor之间相互隔离没有数据竞争,因此Actor可以高并发运行。
2095
2096### 注意事项
2097- Worker存在数量限制,当前支持最多同时存在7个Worker。
2098- 在API version 8及之前的版本,当Worker数量超出限制时,会抛出错误Error "Too many workers, the number of workers exceeds the maximum."。
2099- 从API version 9开始,当Worker数量超出限制时,会抛出错误BusinessError "Worker initialization failure, the number of workers exceeds the maximum"。
2100- 主动销毁Worker可以调用新创建Worker对象的terminate()或parentPort.close()方法。
2101- 自API version 9版本开始,若Worker处于已经销毁或正在销毁等非运行状态时,调用其功能接口,会抛出相应的BusinessError。
2102- Worker的创建和销毁耗费性能,建议管理已创建的Worker并重复使用。
2103- 创建Worker工程时,new worker.Worker构造函数和new worker.ThreadWorker构造函数不能同时使用,否则将导致工程中Worker的功能异常。自API version 9版本开始,建议使用[new worker.ThreadWorker](#constructor9)构造函数,在API version 8及之前的版本,建议使用[new worker.Worker](#constructordeprecated)构造函数。
2104- 创建Worker工程时,在Worker线程的文件中(比如本文中worker.ts)不能导入任何有关构建UI的方法(比如ETS文件等),否则会导致Worker的功能失效。排查方式:解压生成的Hap包,在创建Worker线程的文件目录中找到"worker.js",全局搜索"View"关键字。如果存在该关键字,说明在worker.js中打包进去了构建UI的方法,会导致Worker的功能失效,建议在创建Worker线程的文件中修改 "import “xxx” from src"中src的目录层级。
2105
2106## 完整示例
2107> **说明:**<br/>
2108> 以API version 9的工程为例。<br> API version 8及之前的版本仅支持FA模型,如需使用,注意更换构造Worker的接口和创建worker线程中与主线程通信的对象的两个方法。
2109### FA模型
2110
2111```js
2112// main.js(同级目录为例)
2113import worker from '@ohos.worker';
2114// 主线程中创建Worker对象
2115const workerInstance = new worker.ThreadWorker("workers/worker.ts");
2116// 创建js和ts文件都可以
2117// const workerInstance = new worker.ThreadWorker("workers/worker.js");
2118
2119// API version 9之前版本,worker对象的构造方法
2120// const workerInstance = new worker.Worker("workers/worker.js");
2121
2122// 主线程向worker线程传递信息
2123workerInstance.postMessage("123");
2124
2125// 主线程接收worker线程信息
2126workerInstance.onmessage = function(e) {
2127    // data:worker线程发送的信息
2128    let data = e.data;
2129    console.log("main.js onmessage");
2130
2131    // 销毁Worker对象
2132    workerInstance.terminate();
2133}
2134
2135// 在调用terminate后,执行回调onexit
2136workerInstance.onexit = function() {
2137    console.log("main.js terminate");
2138}
2139```
2140```js
2141// worker.ts
2142import worker from '@ohos.worker';
2143
2144// 创建worker线程中与主线程通信的对象
2145const workerPort = worker.workerPort
2146
2147// API version 9之前版本,创建worker线程中与主线程通信的对象
2148// const parentPort = worker.parentPort
2149
2150// worker线程接收主线程信息
2151workerPort.onmessage = function(e) {
2152    // data:主线程发送的信息
2153    let data = e.data;
2154    console.log("worker.ts onmessage");
2155
2156    // worker线程向主线程发送信息
2157    workerPort.postMessage("123")
2158}
2159
2160// worker线程发生error的回调
2161workerPort.onerror= function(e) {
2162    console.log("worker.ts onerror");
2163}
2164```
2165build-profile.json5 配置 :
2166```json
2167  "buildOption": {
2168    "sourceOption": {
2169      "workers": [
2170        "./src/main/ets/MainAbility/workers/worker.ts"
2171      ]
2172    }
2173  }
2174```
2175### Stage模型
2176```js
2177// main.js(以不同目录为例)
2178import worker from '@ohos.worker';
2179
2180// 主线程中创建Worker对象
2181const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.ts");
2182// 创建js和ts文件都可以
2183// const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.js");
2184
2185// 主线程向worker线程传递信息
2186workerInstance.postMessage("123");
2187
2188// 主线程接收worker线程信息
2189workerInstance.onmessage = function(e) {
2190    // data:worker线程发送的信息
2191    let data = e.data;
2192    console.log("main.js onmessage");
2193
2194    // 销毁Worker对象
2195    workerInstance.terminate();
2196}
2197// 在调用terminate后,执行onexit
2198workerInstance.onexit = function() {
2199    console.log("main.js terminate");
2200}
2201```
2202```js
2203// worker.ts
2204import worker from '@ohos.worker';
2205
2206// 创建worker线程中与主线程通信的对象
2207const workerPort = worker.workerPort
2208
2209// worker线程接收主线程信息
2210workerPort.onmessage = function(e) {
2211    // data:主线程发送的信息
2212    let data = e.data;
2213    console.log("worker.ts onmessage");
2214
2215    // worker线程向主线程发送信息
2216    workerPort.postMessage("123")
2217}
2218
2219// worker线程发生error的回调
2220workerPort.onerror= function(e) {
2221    console.log("worker.ts onerror");
2222}
2223```
2224build-profile.json5 配置:
2225```json
2226  "buildOption": {
2227    "sourceOption": {
2228      "workers": [
2229        "./src/main/ets/pages/workers/worker.ts"
2230      ]
2231    }
2232  }
2233```
2234<!--no_check-->