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