js-apis-worker.md 76.3 KB
Newer Older
1
# @ohos.worker (启动一个Worker)
Z
zengyawen 已提交
2

Z
zengyawen 已提交
3
Worker是与主线程并行的独立线程。创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处理耗时操作但不可以直接操作UI。
Y
yqhan 已提交
4 5 6

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

Y
yqhan 已提交
7 8
Worker的上下文对象和主线程的上下文对象是不同的,Worker线程不支持UI操作。

zyjhandsome's avatar
zyjhandsome 已提交
9
> **说明:**<br/>
10
> 本模块首批接口从API version 7 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
Z
zengyawen 已提交
11 12

## 导入模块
Z
zengyawen 已提交
13

14
```ts
Z
zengyawen 已提交
15 16 17
import worker from '@ohos.worker';
```

Z
zengyawen 已提交
18 19 20

## 属性

21
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
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>替代。 |
Z
zengyawen 已提交
27 28 29


## WorkerOptions
Z
zengyawen 已提交
30

Z
zengyawen 已提交
31 32
Worker构造函数的选项信息,用于为Worker添加其他信息。

33
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
34

Y
yqhan 已提交
35
| 名称 | 类型 | 可读 | 可写 | 说明 |
36
| ---- | -------- | ---- | ---- | -------------- |
Y
yqhan 已提交
37 38 39
| type | "classic" \| "module" | 是   | 是 | Worker执行脚本的模式类型,暂不支持module类型,默认值为"classic"。 |
| name | string   | 是   | 是 | Worker的名称,默认值为 undefined 。 |
| shared | boolean | 是   | 是 | 表示Worker共享功能,此接口暂不支持。 |
Z
zengyawen 已提交
40 41


42 43
## ThreadWorker<sup>9+</sup>

Y
yqhan 已提交
44
使用以下方法前,均需先构造ThreadWorker实例,ThreadWorker类继承[WorkerEventTarget](#workereventtarget9)
45 46 47 48 49

### constructor<sup>9+</sup>

constructor(scriptURL: string, options?: WorkerOptions)

Y
yqhan 已提交
50
ThreadWorker构造函数。
51 52 53 54 55 56 57 58 59 60 61 62

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名    | 类型                            | 必填 | 说明                                                         |
| --------- | ------------------------------- | ---- | ------------------------------------------------------------ |
| scriptURL | string                          | 是   | Worker执行脚本的路径。<br/>在FA和Stage模型下,DevEco Studio新建Worker工程路径分别存在以下两种情况:<br/>(a) worker脚本所在目录与pages目录同级。<br/>(b) worker脚本所在目录与pages目录不同级。 |
| options   | [WorkerOptions](#workeroptions) | 否   | Worker构造的选项。                                           |

**返回值:**

Y
yqhan 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76
| 类型         | 说明                                                         |
| ------------ | ------------------------------------------------------------ |
| ThreadWorker | 执行ThreadWorker构造函数生成的ThreadWorker对象,失败则返回undefined。 |

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息 |
| -------- | -------- |
| 10200003 | Worker initialization failure. |
| 10200007 | The worker file patch is invalid path. |


77 78 79

**示例:**

80
```ts
81 82 83
import worker from '@ohos.worker';
// worker线程创建

84
// FA模型-目录同级(entry模块下,workers目录与pages目录同级)
Y
yqhan 已提交
85
const workerFAModel01 = new worker.ThreadWorker("workers/worker.ts", {name:"first worker in FA model"});
86
// FA模型-目录不同级(entry模块下,workers目录与pages目录的父目录同级)
Y
yqhan 已提交
87
const workerFAModel02 = new worker.ThreadWorker("../workers/worker.ts");
88

89
// Stage模型-目录同级(entry模块下,workers目录与pages目录同级)
90
const workerStageModel01 = new worker.ThreadWorker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
91
// Stage模型-目录不同级(entry模块下,workers目录是pages目录的子目录)
92 93 94
const workerStageModel02 = new worker.ThreadWorker('entry/ets/pages/workers/worker.ts');

// 理解Stage模型scriptURL的"entry/ets/workers/worker.ts":
95 96
// entry: 为module.json5文件中module的name属性对应的值,ets: 表明当前使用的语言。
// scriptURL与worker文件所在的workers目录层级有关,与new worker所在文件无关。
97 98 99 100 101 102 103 104

// Stage模型工程esmodule编译场景下,支持新增的scriptURL规格:@bundle:bundlename/entryname/ets/workerdir/workerfile
// @bundle:为固定标签,bundlename为当前应用包名,entryname为当前模块名,ets为当前使用语言
// workerdir为worker文件所在目录,workerfile为worker文件名
// Stage模型-目录同级(entry模块下,workers目录与pages目录同级),假设bundlename是com.example.workerdemo
const workerStageModel03 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/workers/worker');
// Stage模型-目录不同级(entry模块下,workers目录是pages目录的子目录),假设bundlename是com.example.workerdemo
const workerStageModel04 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/pages/workers/worker');
105 106 107 108 109 110 111 112 113 114 115 116
```

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

(1) 目录同级

FA模型:

```json
  "buildOption": {
    "sourceOption": {
      "workers": [
117
        "./src/main/ets/entryability/workers/worker.ts"
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
      ]
    }
  }
```

Stage模型:

```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/workers/worker.ts"
      ]
    }
  }
```

(2) 目录不同级

FA模型:

```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/workers/worker.ts"
      ]
    }
  }
```

Stage模型:

```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/pages/workers/worker.ts"
      ]
    }
  }
```

Y
yqhan 已提交
161 162
### postMessage<sup>9+</sup>

Y
yqhan 已提交
163
postMessage(message: Object, transfer: ArrayBuffer[]): void
Y
yqhan 已提交
164

Y
yqhan 已提交
165
宿主线程通过转移对象所有权的方式向Worker线程发送消息。
Y
yqhan 已提交
166 167 168 169 170 171 172

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名   | 类型          | 必填 | 说明                                                         |
| -------- | ------------- | ---- | ------------------------------------------------------------ |
Y
yqhan 已提交
173 174
| message  | Object        | 是   | 发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
| transfer | ArrayBuffer[] | 是   | 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用,数组不可传入null。 |
Y
yqhan 已提交
175 176 177 178 179 180 181 182

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                |
| -------- | ----------------------------------------- |
| 10200004 | Worker instance is not running.           |
B
buzhuyu 已提交
183
| 10200006 | An exception occurred during serialization. |
Y
yqhan 已提交
184 185 186

**示例:**

187
```ts
188
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
Y
yqhan 已提交
189

190
let buffer = new ArrayBuffer(8);
Y
yqhan 已提交
191 192
workerInstance.postMessage(buffer, [buffer]);
```
193 194 195 196 197

### postMessage<sup>9+</sup>

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

Y
yqhan 已提交
198
宿主线程通过转移对象所有权或者拷贝数据的方式向Worker线程发送消息。
199 200 201 202 203 204 205

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名  | 类型                                      | 必填 | 说明                                                         |
| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
Y
yqhan 已提交
206 207
| message | Object                                    | 是   | 发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
| options | [PostMessageOptions](#postmessageoptions) | 否   | 当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用。<br>若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到Worker线程。 |
208

Y
yqhan 已提交
209 210 211 212 213 214 215
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                |
| -------- | ----------------------------------------- |
| 10200004 | Worker instance is not running.           |
B
buzhuyu 已提交
216
| 10200006 | An exception occurred during serialization. |
Y
yqhan 已提交
217

218 219
**示例:**

220
```ts
221
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
222 223 224

workerInstance.postMessage("hello world");

225
let buffer = new ArrayBuffer(8);
226 227 228 229 230 231 232
workerInstance.postMessage(buffer, [buffer]);
```

### on<sup>9+</sup>

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

Y
yqhan 已提交
233
向Worker添加一个事件监听,该接口与[addEventListener<sup>9+</sup>](#addeventlistener9)接口功能一致。
234 235 236 237 238 239 240 241

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名   | 类型                                         | 必填 | 说明                   |
| -------- | -------------------------------------------- | ---- | ---------------------- |
| type     | string                                       | 是   | 监听的事件类型。       |
242
| listener | [WorkerEventListener](#workereventlistener9) | 是 | 回调的事件。回调事件。 |
243

Y
yqhan 已提交
244 245 246 247 248 249 250 251 252
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |

253 254
**示例:**

255
```ts
256
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
workerInstance.on("alert", (e)=>{
    console.log("alert listener callback");
})
```


### once<sup>9+</sup>

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

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

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名   | 类型                                         | 必填 | 说明                   |
| -------- | -------------------------------------------- | ---- | ---------------------- |
| type     | string                                       | 是   | 监听的事件类型。       |
276
| listener | [WorkerEventListener](#workereventlistener9) | 是 | 回调的事件。回调事件。 |
277

Y
yqhan 已提交
278 279 280 281 282 283 284 285 286
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |

287 288
**示例:**

289
```ts
290
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
291 292 293 294 295 296 297 298 299 300
workerInstance.once("alert", (e)=>{
    console.log("alert listener callback");
})
```


### off<sup>9+</sup>

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

Y
yqhan 已提交
301
删除类型为type的事件监听,该接口与[removeEventListener<sup>9+</sup>](#removeeventlistener9)接口功能一致。
302 303 304 305 306 307 308 309

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名   | 类型                                         | 必填 | 说明                         |
| -------- | -------------------------------------------- | ---- | ---------------------------- |
| type     | string                                       | 是   | 需要删除的事件类型。         |
310
| listener | [WorkerEventListener](#workereventlistener9) | 否 | 回调的事件。删除的回调事件。 |
311

Y
yqhan 已提交
312 313 314 315 316 317 318 319 320
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |

321 322
**示例:**

323
```ts
324
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
Y
yqhan 已提交
325
//使用on接口、once接口或addEventListener接口创建“alert”事件,使用off接口删除事件。
326 327 328 329 330 331 332 333 334 335 336 337
workerInstance.off("alert");
```


### terminate<sup>9+</sup>

terminate(): void

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

**系统能力:** SystemCapability.Utils.Lang

Y
yqhan 已提交
338 339 340 341 342 343 344 345
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                      |
| -------- | ------------------------------- |
| 10200004 | Worker instance is not running. |

346 347
**示例:**

348
```ts
349
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
workerInstance.terminate();
```


### onexit<sup>9+</sup>

onexit?: (code: number) =&gt; void

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

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名 | 类型   | 必填 | 说明               |
| ------ | ------ | ---- | ------------------ |
366
| code   | number | 是   | Worker退出的code。 |
367

Y
yqhan 已提交
368 369 370 371 372 373 374 375 376
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |

377 378
**示例:**

379
```ts
380
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
381 382
workerInstance.onexit = () => {
 console.log("onexit");
383
}
Y
yqhan 已提交
384 385

//onexit被执行两种方式:
Y
yqhan 已提交
386
// main thread:
Y
yqhan 已提交
387 388
workerInstance.terminate();

Y
yqhan 已提交
389
// worker线程:
390
//workerPort.close()
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
```


### onerror<sup>9+</sup>

onerror?: (err: ErrorEvent) =&gt; void

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

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名 | 类型                      | 必填 | 说明       |
| ------ | ------------------------- | ---- | ---------- |
406
| err    | [ErrorEvent](#errorevent) | 是   | 异常数据。 |
407

Y
yqhan 已提交
408 409 410 411 412 413 414 415 416
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |

417 418
**示例:**

419
```ts
420
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
421
workerInstance.onerror = () => {
422 423 424 425 426 427 428
    console.log("onerror");
}
```


### onmessage<sup>9+</sup>

429
onmessage?: (event: MessageEvents) =&gt; void
430

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

**系统能力:** SystemCapability.Utils.Lang

**参数:**

437 438 439
| 参数名 | 类型                             | 必填 | 说明                   |
| ------ | -------------------------------- | ---- | ---------------------- |
| event  | [MessageEvents](#messageevents9) | 是   | 收到的Worker消息数据。 |
440

Y
yqhan 已提交
441 442 443 444 445 446 447 448 449
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |

450 451
**示例:**

452 453 454
```ts
import worker, { MessageEvents } from '@ohos.worker';

455
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
456 457 458 459
workerInstance.onmessage = (e: MessageEvents): void => {
 // e : MessageEvents, 用法如下:
 // let data = e.data;
 console.log("onmessage");
460 461 462 463 464 465
}
```


### onmessageerror<sup>9+</sup>

466
onmessageerror?: (event: MessageEvents) =&gt; void
467 468 469 470 471 472 473

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

**系统能力:** SystemCapability.Utils.Lang

**参数:**

474 475 476
| 参数名 | 类型                             | 必填 | 说明       |
| ------ | -------------------------------- | ---- | ---------- |
| event  | [MessageEvents](#messageevents9) | 是   | 异常数据。 |
477

Y
yqhan 已提交
478 479 480 481 482 483 484 485 486
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |

487 488
**示例:**

489
```ts
490
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
491
workerInstance.onmessageerror= () => {
492 493 494 495
    console.log("onmessageerror");
}
```

Y
yqhan 已提交
496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521
### addEventListener<sup>9+</sup>

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

向Worker添加一个事件监听,该接口与[on<sup>9+</sup>](#on9)接口功能一致。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名   | 类型                                         | 必填 | 说明             |
| -------- | -------------------------------------------- | ---- | ---------------- |
| type     | string                                       | 是   | 监听的事件类型。 |
| listener | [WorkerEventListener](#workereventlistener9) | 是   | 回调的事件。     |

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |

**示例:**

522
```ts
523
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
Y
yqhan 已提交
524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
```


### removeEventListener<sup>9+</sup>

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

删除Worker的事件监听,该接口与[off<sup>9+</sup>](#off9)接口功能一致。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名   | 类型                                         | 必填 | 说明                         |
| -------- | -------------------------------------------- | ---- | ---------------------------- |
| type     | string                                       | 是   | 需要删除的监听事件类型。     |
| callback | [WorkerEventListener](#workereventlistener9) | 否 | 回调的事件。删除的回调事件。 |

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                      |
| -------- | ------------------------------- |
| 10200004 | Worker instance is not running. |

**示例:**

555
```ts
556
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
Y
yqhan 已提交
557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
workerInstance.removeEventListener("alert");
```


### dispatchEvent<sup>9+</sup>

dispatchEvent(event: Event): boolean

分发定义在Worker的事件。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名 | 类型            | 必填 | 说明             |
| ------ | --------------- | ---- | ---------------- |
| event  | [Event](#event) | 是   | 需要分发的事件。 |

**返回值:**

| 类型    | 说明                            |
| ------- | ------------------------------- |
| boolean | 分发的结果,false表示分发失败。 |

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                      |
| -------- | ------------------------------- |
| 10200004 | Worker instance is not running. |

**示例:**

594
```ts
595
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
596 597 598 599 600 601

workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。
```

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

602
```ts
603
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
604

Y
yqhan 已提交
605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634
//用法一:
workerInstance.on("alert_on", (e)=>{
    console.log("alert listener callback");
})
workerInstance.once("alert_once", (e)=>{
    console.log("alert listener callback");
})
workerInstance.addEventListener("alert_add", (e)=>{
    console.log("alert listener callback");
})

//once接口创建的事件执行一次便会删除。
workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
//on接口创建的事件可以一直被分发,不能主动删除。
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
//addEventListener接口创建的事件可以一直被分发,不能主动删除。
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});

//用法二:
//event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
//当type = "message",onmessage接口定义的方法同时会执行。
//当type = "messageerror",onmessageerror接口定义的方法同时会执行。
//当type = "error",onerror接口定义的方法同时会执行。
//若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。

workerInstance.addEventListener("message", (e)=>{
    console.log("message listener callback");
})
635
workerInstance.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660
    console.log("onmessage : message listener callback");
}
//调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
workerInstance.dispatchEvent({type:"message", timeStamp:0});
```


### removeAllListener<sup>9+</sup>

removeAllListener(): void

删除Worker所有的事件监听。

**系统能力:** SystemCapability.Utils.Lang

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                      |
| -------- | ------------------------------- |
| 10200004 | Worker instance is not running. |

**示例:**

661
```ts
662
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
Y
yqhan 已提交
663 664 665 666 667
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
workerInstance.removeAllListener();
```
668 669 670 671 672 673 674

## WorkerEventTarget<sup>9+</sup>

### addEventListener<sup>9+</sup>

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

Y
yqhan 已提交
675
向Worker添加一个事件监听,该接口与[on<sup>9+</sup>](#on9)接口功能一致。
676 677 678 679 680 681 682 683 684 685

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名   | 类型                                         | 必填 | 说明             |
| -------- | -------------------------------------------- | ---- | ---------------- |
| type     | string                                       | 是   | 监听的事件类型。 |
| listener | [WorkerEventListener](#workereventlistener9) | 是   | 回调的事件。     |

Y
yqhan 已提交
686 687 688 689 690 691 692 693 694
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |

695 696
**示例:**

697
```ts
698
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
699 700 701 702 703 704 705 706 707 708
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
```


### removeEventListener<sup>9+</sup>

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

Y
yqhan 已提交
709
删除Worker的事件监听,该接口与[off<sup>9+</sup>](#off9)接口功能一致。
710 711 712 713 714 715 716 717

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名   | 类型                                         | 必填 | 说明                         |
| -------- | -------------------------------------------- | ---- | ---------------------------- |
| type     | string                                       | 是   | 需要删除的监听事件类型。     |
718
| callback | [WorkerEventListener](#workereventlistener9) | 否 | 回调的事件。删除的回调事件。 |
719

Y
yqhan 已提交
720 721 722 723 724 725 726 727
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                      |
| -------- | ------------------------------- |
| 10200004 | Worker instance is not running. |

728 729
**示例:**

730
```ts
731
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
Y
yqhan 已提交
732 733 734
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
735 736
workerInstance.removeEventListener("alert");
```
Z
zengyawen 已提交
737 738


739
### dispatchEvent<sup>9+</sup>
Z
zengyawen 已提交
740

741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758
dispatchEvent(event: Event): boolean

分发定义在Worker的事件。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名 | 类型            | 必填 | 说明             |
| ------ | --------------- | ---- | ---------------- |
| event  | [Event](#event) | 是   | 需要分发的事件。 |

**返回值:**

| 类型    | 说明                            |
| ------- | ------------------------------- |
| boolean | 分发的结果,false表示分发失败。 |

Y
yqhan 已提交
759 760 761 762 763 764 765 766
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                      |
| -------- | ------------------------------- |
| 10200004 | Worker instance is not running. |

767 768
**示例:**

769
```ts
770
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
771 772 773 774 775 776

workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。
```

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

777
```ts
778
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
779

Y
yqhan 已提交
780 781 782 783 784 785 786 787 788 789 790 791
//用法一:
workerInstance.on("alert_on", (e)=>{
    console.log("alert listener callback");
})
workerInstance.once("alert_once", (e)=>{
    console.log("alert listener callback");
})
workerInstance.addEventListener("alert_add", (e)=>{
    console.log("alert listener callback");
})

//once接口创建的事件执行一次便会删除。
Y
yqhan 已提交
792
workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
Y
yqhan 已提交
793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809
//on接口创建的事件可以一直被分发,不能主动删除。
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
//addEventListener接口创建的事件可以一直被分发,不能主动删除。
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});

//用法二:
//event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
//当type = "message",onmessage接口定义的方法同时会执行。
//当type = "messageerror",onmessageerror接口定义的方法同时会执行。
//当type = "error",onerror接口定义的方法同时会执行。
//若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。

workerInstance.addEventListener("message", (e)=>{
    console.log("message listener callback");
})
810
workerInstance.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
811 812 813 814
    console.log("onmessage : message listener callback");
}
//调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
workerInstance.dispatchEvent({type:"message", timeStamp:0});
815 816 817 818 819 820 821 822 823 824 825
```


### removeAllListener<sup>9+</sup>

removeAllListener(): void

删除Worker所有的事件监听。

**系统能力:** SystemCapability.Utils.Lang

Y
yqhan 已提交
826 827 828 829 830 831 832 833
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                      |
| -------- | ------------------------------- |
| 10200004 | Worker instance is not running. |

834 835
**示例:**

836
```ts
837
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
Y
yqhan 已提交
838 839 840
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
841 842 843 844 845 846
workerInstance.removeAllListener();
```


## ThreadWorkerGlobalScope<sup>9+</sup>

W
wangzhaoyong 已提交
847
Worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口销毁Worker线程。ThreadWorkerGlobalScope类继承[GlobalScope<sup>9+</sup>](#globalscope9)
848

Y
yqhan 已提交
849 850 851 852
### postMessage<sup>9+</sup>

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

Y
yqhan 已提交
853
Worker线程通过转移对象所有权的方式向宿主线程发送消息。
Y
yqhan 已提交
854 855 856 857 858

**系统能力:** SystemCapability.Utils.Lang

**参数:**

Y
yqhan 已提交
859 860 861 862
| 参数名   | 类型          | 必填 | 说明                                                         |
| -------- | ------------- | ---- | ------------------------------------------------------------ |
| message  | Object        | 是   | 发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
| transfer | ArrayBuffer[] | 是   | 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用,数组不可传入null。 |
Y
yqhan 已提交
863 864 865 866 867 868 869 870

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                |
| -------- | ----------------------------------------- |
| 10200004 | Worker instance is not running.           |
B
buzhuyu 已提交
871
| 10200006 | An exception occurred during serialization. |
Y
yqhan 已提交
872 873 874

**示例:**

875
```ts
Y
yqhan 已提交
876
// main thread
Y
yqhan 已提交
877
import worker from '@ohos.worker';
878
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
Y
yqhan 已提交
879
workerInstance.postMessage("hello world");
880
workerInstance.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
881
    console.log("receive data from worker.ts");
Y
yqhan 已提交
882 883 884
}
```

885
```ts
886
// worker.ts
Y
yqhan 已提交
887 888
import worker from '@ohos.worker';
const workerPort = worker.workerPort;
889 890
workerPort.onmessage = (e: MessageEvents): void => {
    let buffer = new ArrayBuffer(8);
Y
yqhan 已提交
891 892 893
    workerPort.postMessage(buffer, [buffer]);
}
```
894 895 896 897 898

### postMessage<sup>9+</sup>

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

Y
yqhan 已提交
899
Worker线程通过转移对象所有权或者拷贝数据的方式向宿主线程发送消息。
900 901 902 903 904 905 906

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名  | 类型                                      | 必填 | 说明                                                         |
| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
Y
yqhan 已提交
907 908
| message | Object                                    | 是   | 发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
| options | [PostMessageOptions](#postmessageoptions) | 否   | 当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用。<br/>若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到宿主线程。 |
909

Y
yqhan 已提交
910 911 912 913 914 915 916
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                |
| -------- | ----------------------------------------- |
| 10200004 | Worker instance is not running.           |
B
buzhuyu 已提交
917
| 10200006 | An exception occurred during serialization. |
Y
yqhan 已提交
918

919 920
**示例:**

921
```ts
Y
yqhan 已提交
922
// main thread
923
import worker from '@ohos.worker';
924
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
925
workerInstance.postMessage("hello world");
926
workerInstance.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
927
    console.log("receive data from worker.ts");
928 929 930
}
```

931
```ts
932
// worker.ts
933
import worker from '@ohos.worker';
Y
yqhan 已提交
934
const workerPort = worker.workerPort;
935
workerPort.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
936
    workerPort.postMessage("receive data from main thread");
937 938 939 940 941 942 943 944 945 946 947 948
}
```


### close<sup>9+</sup>

close(): void

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

**系统能力:** SystemCapability.Utils.Lang

Y
yqhan 已提交
949 950 951 952 953 954 955 956
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                      |
| -------- | ------------------------------- |
| 10200004 | Worker instance is not running. |

957 958
**示例:**

959
```ts
Y
yqhan 已提交
960
// main thread
961
import worker from '@ohos.worker';
962
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
963 964
```

965
```ts
966
// worker.ts
967
import worker from '@ohos.worker';
Y
yqhan 已提交
968
const workerPort = worker.workerPort;
969
workerPort.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
970
    workerPort.close()
971 972 973 974 975 976
}
```


### onmessage<sup>9+</sup>

Y
yqhan 已提交
977
onmessage?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) =&gt; void
978

Y
yqhan 已提交
979
ThreadWorkerGlobalScope的onmessage属性表示Worker线程收到来自其宿主线程通过postMessage接口发送的消息时被调用的事件处理程序,处理程序在Worker线程中执行。
980 981 982 983 984

**系统能力:** SystemCapability.Utils.Lang

**参数:**

Y
yqhan 已提交
985 986 987
| 参数名 | 类型                                                 | 必填 | 说明                     |
| ------ | ---------------------------------------------------- | ---- | ------------------------ |
| this   | [ThreadWorkerGlobalScope](#threadworkerglobalscope9) | 是   | 指向调用者对象。         |
Y
yqhan 已提交
988 989 990 991 992 993 994 995 996 997
| ev     | [MessageEvents](#messageevents9)                     | 是   | 收到宿主线程发送的数据。 |

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |
998 999 1000

**示例:**

1001
```ts
Y
yqhan 已提交
1002
// main thread
1003
import worker from '@ohos.worker';
1004
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
1005 1006 1007
workerInstance.postMessage("hello world");
```

1008
```ts
1009
// worker.ts
1010
import worker from '@ohos.worker';
Y
yqhan 已提交
1011
const workerPort = worker.workerPort;
1012
workerPort.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
1013
    console.log("receive main thread message");
1014 1015 1016 1017 1018 1019
}
```


### onmessageerror<sup>9+</sup>

Y
yqhan 已提交
1020
onmessageerror?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) =&gt; void
1021

Y
yqhan 已提交
1022
ThreadWorkerGlobalScope的onmessageerror属性表示当Worker对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在Worker线程中执行。
1023 1024 1025 1026 1027

**系统能力:** SystemCapability.Utils.Lang

**参数:**

1028 1029
| 参数名 | 类型                             | 必填 | 说明       |
| ------ | -------------------------------- | ---- | ---------- |
Y
yqhan 已提交
1030
| this   | [ThreadWorkerGlobalScope](#threadworkerglobalscope9) | 是   | 指向调用者对象。         |
Y
yqhan 已提交
1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
| ev     | [MessageEvents](#messageevents9) | 是   | 异常数据。 |

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |
1041 1042 1043

**示例:**

1044
```ts
Y
yqhan 已提交
1045
// main thread
1046
import worker from '@ohos.worker';
1047
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
1048 1049
```

1050
```ts
1051
// worker.ts
1052
import worker from '@ohos.worker';
1053
const workerPort = worker.workerPort;
1054
workerPort.onmessageerror = () => {
Y
yqhan 已提交
1055
    console.log("worker.ts onmessageerror")
1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
}
```


## WorkerEventListener<sup>9+</sup>

(event: Event): void | Promise&lt;void&gt;

事件监听类。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名 | 类型            | 必填 | 说明           |
| ------ | --------------- | ---- | -------------- |
| event  | [Event](#event) | 是   | 回调的事件类。 |

**返回值:**

| 类型                                  | 说明                            |
| ------------------------------------- | ------------------------------- |
| void&nbsp;\|&nbsp;Promise&lt;void&gt; | 无返回值或者以Promise形式返回。 |

Y
yqhan 已提交
1080 1081 1082 1083 1084 1085 1086 1087 1088
**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                   |
| -------- | -------------------------------------------- |
| 10200004 | Worker instance is not running.              |
| 10200005 | The invoked API is not supported in workers. |

1089 1090
**示例:**

1091
```ts
1092
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
1093
workerInstance.addEventListener("alert", ()=>{
1094 1095 1096 1097 1098 1099 1100
    console.log("alert listener callback");
})
```


## GlobalScope<sup>9+</sup>

W
wangzhaoyong 已提交
1101
Worker线程自身的运行环境,GlobalScope类继承[WorkerEventTarget](#workereventtarget9)
1102 1103 1104 1105 1106

### 属性

**系统能力:** SystemCapability.Utils.Lang

1107
| 名称 | 类型                                                         | 可读 | 可写 | 说明                                  |
1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124
| ---- | ------------------------------------------------------------ | ---- | ---- | ------------------------------------- |
| name | string                                                       | 是   | 否   | Worker的名字,new&nbsp;Worker时指定。 |
| self | [GlobalScope](#globalscope9)&nbsp;&amp;&nbsp;typeof&nbsp;globalThis | 是   | 否   | GlobalScope本身。                     |


### onerror<sup>9+</sup>

onerror?: (ev: ErrorEvent) =&gt; void

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

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名 | 类型                      | 必填 | 说明       |
| ------ | ------------------------- | ---- | ---------- |
1125
| ev     | [ErrorEvent](#errorevent) | 是   | 异常数据。 |
1126 1127 1128

**示例:**

1129
```ts
Y
yqhan 已提交
1130
// main thread
1131
import worker from '@ohos.worker';
1132
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts")
1133 1134
```

1135
```ts
1136
// worker.ts
1137
import worker from '@ohos.worker';
Y
yqhan 已提交
1138
const workerPort = worker.workerPort
1139
workerPort.onerror = () => {
Y
yqhan 已提交
1140
    console.log("worker.ts onerror")
1141 1142 1143
}
```

1144 1145 1146 1147 1148 1149 1150 1151 1152
## MessageEvents<sup>9+</sup>

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

**系统能力:** SystemCapability.Utils.Lang

| 名称 | 类型 | 可读 | 可写 | 说明               |
| ---- | ---- | ---- | ---- | ------------------ |
| data | any  | 是   | 否   | 线程间传递的数据。 |
1153 1154 1155 1156 1157 1158 1159

## Worker<sup>(deprecated)</sup>


使用以下方法前,均需先构造Worker实例,Worker类继承[EventTarget](#eventtarget)

> **说明:**<br/>
1160 1161 1162
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker<sup>9+</sup>](#threadworker9)替代。

### constructor<sup>(deprecated)</sup>
Z
zengyawen 已提交
1163 1164

constructor(scriptURL: string, options?: WorkerOptions)
Z
zengyawen 已提交
1165

Z
zengyawen 已提交
1166 1167
Worker构造函数。

1168 1169 1170
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.constructor<sup>9+</sup>](#constructor9)替代。

Z
zengyawen 已提交
1171
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1172

Z
zengyawen 已提交
1173 1174
**参数:**

Z
zengyawen 已提交
1175 1176
| 参数名    | 类型                            | 必填 | 说明                                                         |
| --------- | ------------------------------- | ---- | ------------------------------------------------------------ |
1177
| scriptURL | string                          | 是   | Worker执行脚本的路径。<br/>在FA和Stage模型下,DevEco Studio新建Worker工程路径分别存在以下两种情况:<br/>(a) worker脚本所在目录与pages目录同级。<br/>(b) worker脚本所在目录与pages目录不同级。 |
Z
zengyawen 已提交
1178
| options   | [WorkerOptions](#workeroptions) | 否   | Worker构造的选项。                                           |
Z
zengyawen 已提交
1179

Z
zengyawen 已提交
1180
**返回值:**
Z
zengyawen 已提交
1181

Z
zengyawen 已提交
1182 1183 1184
| 类型   | 说明                                                      |
| ------ | --------------------------------------------------------- |
| Worker | 执行Worker构造函数生成的Worker对象,失败则返回undefined。 |
Z
zengyawen 已提交
1185 1186 1187

**示例:**

1188
```ts
W
wangzhaoyong 已提交
1189
import worker from '@ohos.worker';
Y
yqhan 已提交
1190 1191 1192
// worker线程创建

// FA模型-目录同级
Y
yqhan 已提交
1193
const workerFAModel01 = new worker.Worker("workers/worker.ts", {name:"first worker in FA model"});
Y
yqhan 已提交
1194
// FA模型-目录不同级(以workers目录放置pages目录前一级为例)
Y
yqhan 已提交
1195
const workerFAModel02 = new worker.Worker("../workers/worker.ts");
Y
yqhan 已提交
1196 1197

// Stage模型-目录同级
W
wangzhaoyong 已提交
1198
const workerStageModel01 = new worker.Worker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
Y
yqhan 已提交
1199
// Stage模型-目录不同级(以workers目录放置pages目录后一级为例)
W
wangzhaoyong 已提交
1200
const workerStageModel02 = new worker.Worker('entry/ets/pages/workers/worker.ts');
Y
yqhan 已提交
1201

W
wangzhaoyong 已提交
1202 1203
// 理解Stage模型scriptURL的"entry/ets/workers/worker.ts":
// entry: 为module.json5文件中module的name属性对应的值;
Y
yqhan 已提交
1204 1205
// ets: 表明当前使用的语言。
```
W
wangzhaoyong 已提交
1206
同时,需在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息,主要分为下面两种情况:
Y
yqhan 已提交
1207

W
wangzhaoyong 已提交
1208
(1) 目录同级
W
wangzhaoyong 已提交
1209

Y
yqhan 已提交
1210 1211 1212 1213 1214 1215
FA模型:

```json
  "buildOption": {
    "sourceOption": {
      "workers": [
1216
        "./src/main/ets/entryability/workers/worker.ts"
Y
yqhan 已提交
1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230
      ]
    }
  }
```
Stage模型:
```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/workers/worker.ts"
      ]
    }
  }
```
W
wangzhaoyong 已提交
1231
(2) 目录不同级
W
wangzhaoyong 已提交
1232

Y
yqhan 已提交
1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251
FA模型:
```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/workers/worker.ts"
      ]
    }
  }
```
Stage模型:
```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/pages/workers/worker.ts"
      ]
    }
  }
Z
zengyawen 已提交
1252
```
Y
yqhan 已提交
1253

1254 1255
### postMessage<sup>(deprecated)</sup>

Y
yqhan 已提交
1256
postMessage(message: Object, transfer: ArrayBuffer[]): void
Z
zengyawen 已提交
1257

Y
yqhan 已提交
1258
宿主线程通过转移对象所有权的方式向Worker线程发送消息。
Z
zengyawen 已提交
1259

1260 1261 1262
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.postMessage<sup>9+</sup>](#postmessage9)替代。

Z
zengyawen 已提交
1263
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1264

Z
zengyawen 已提交
1265 1266
**参数:**

Y
yqhan 已提交
1267 1268 1269 1270
| 参数名   | 类型          | 必填 | 说明                                                         |
| -------- | ------------- | ---- | ------------------------------------------------------------ |
| message  | Object        | 是   | 发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
| transfer | ArrayBuffer[] | 是   | 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用,数组不可传入null。 |
Y
yqhan 已提交
1271 1272 1273

**示例:**

1274
```ts
Y
yqhan 已提交
1275
const workerInstance = new worker.Worker("workers/worker.ts");
Y
yqhan 已提交
1276

1277
let buffer = new ArrayBuffer(8);
Y
yqhan 已提交
1278 1279 1280 1281 1282 1283 1284
workerInstance.postMessage(buffer, [buffer]);
```

### postMessage<sup>(deprecated)</sup>

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

Y
yqhan 已提交
1285
宿主线程通过转移对象所有权或者拷贝数据的方式向Worker线程发送消息。
Y
yqhan 已提交
1286 1287 1288 1289 1290 1291 1292 1293

> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.postMessage<sup>9+</sup>](#postmessage9-1)替代。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

Z
zengyawen 已提交
1294 1295
| 参数名  | 类型                                      | 必填 | 说明                                                         |
| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
Y
yqhan 已提交
1296 1297
| message | Object                                    | 是   | 发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
| options | [PostMessageOptions](#postmessageoptions) | 否   | 当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用。<br/>若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到Worker线程。 |
Z
zengyawen 已提交
1298

Z
zengyawen 已提交
1299 1300
**示例:**

1301
```ts
Y
yqhan 已提交
1302
const workerInstance = new worker.Worker("workers/worker.ts");
W
wangzhaoyong 已提交
1303

Z
zengyawen 已提交
1304
workerInstance.postMessage("hello world");
Y
yqhan 已提交
1305

1306
let buffer = new ArrayBuffer(8);
Y
yqhan 已提交
1307
workerInstance.postMessage(buffer, [buffer]);
Z
zengyawen 已提交
1308
```
Z
zengyawen 已提交
1309 1310


1311 1312
### on<sup>(deprecated)</sup>

Z
zengyawen 已提交
1313
on(type: string, listener: EventListener): void
Z
zengyawen 已提交
1314

Y
yqhan 已提交
1315
向Worker添加一个事件监听,该接口与[addEventListener<sup>(deprecated)</sup>](#addeventlistenerdeprecated)接口功能一致。
Z
zengyawen 已提交
1316

1317 1318 1319
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.on<sup>9+</sup>](#on9)替代。

Z
zengyawen 已提交
1320
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1321

Z
zengyawen 已提交
1322
**参数:**
Z
zengyawen 已提交
1323

Z
zengyawen 已提交
1324 1325
| 参数名   | 类型                            | 必填 | 说明             |
| -------- | ------------------------------- | ---- | ---------------- |
W
wangzhaoyong 已提交
1326
| type     | string                          | 是   | 监听的事件类型。 |
1327
| listener | [EventListener](#eventlistener) | 是   | 回调事件。       |
Z
zengyawen 已提交
1328 1329 1330

**示例:**

1331
```ts
Y
yqhan 已提交
1332
const workerInstance = new worker.Worker("workers/worker.ts");
1333
workerInstance.on("alert", ()=>{
Z
zengyawen 已提交
1334 1335 1336
    console.log("alert listener callback");
})
```
Z
zengyawen 已提交
1337 1338


1339 1340
### once<sup>(deprecated)</sup>

Z
zengyawen 已提交
1341
once(type: string, listener: EventListener): void
Z
zengyawen 已提交
1342

Z
zengyawen 已提交
1343 1344
向Worker添加一个事件监听,事件监听只执行一次便自动删除。

1345 1346 1347
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.once<sup>9+</sup>](#once9)替代。

Z
zengyawen 已提交
1348
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1349

Z
zengyawen 已提交
1350
**参数:**
Z
zengyawen 已提交
1351

Z
zengyawen 已提交
1352 1353
| 参数名   | 类型                            | 必填 | 说明             |
| -------- | ------------------------------- | ---- | ---------------- |
W
wangzhaoyong 已提交
1354
| type     | string                          | 是   | 监听的事件类型。 |
1355
| listener | [EventListener](#eventlistener) | 是   | 回调事件。       |
Z
zengyawen 已提交
1356 1357 1358

**示例:**

1359
```ts
Y
yqhan 已提交
1360
const workerInstance = new worker.Worker("workers/worker.ts");
Z
zengyawen 已提交
1361 1362 1363 1364
workerInstance.once("alert", (e)=>{
    console.log("alert listener callback");
})
```
Z
zengyawen 已提交
1365 1366


1367 1368
### off<sup>(deprecated)</sup>

Z
zengyawen 已提交
1369
off(type: string, listener?: EventListener): void
Z
zengyawen 已提交
1370

Y
yqhan 已提交
1371
删除类型为type的事件监听,该接口与[removeEventListener<sup>(deprecated)</sup>](#removeeventlistenerdeprecated)接口功能一致。
Z
zengyawen 已提交
1372

1373 1374 1375
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.off<sup>9+</sup>](#off9)替代。

Z
zengyawen 已提交
1376
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1377

Z
zengyawen 已提交
1378
**参数:**
Z
zengyawen 已提交
1379

1380 1381 1382 1383
| 参数名   | 类型                            | 必填 | 说明                 |
| -------- | ------------------------------- | ---- | -------------------- |
| type     | string                          | 是   | 需要删除的事件类型。 |
| listener | [EventListener](#eventlistener) | 否   | 删除的回调事件。     |
Z
zengyawen 已提交
1384 1385 1386

**示例:**

1387
```ts
Y
yqhan 已提交
1388
const workerInstance = new worker.Worker("workers/worker.ts");
Y
yqhan 已提交
1389
//使用on接口、once接口或addEventListener接口创建“alert”事件,使用off接口删除事件。
Z
zengyawen 已提交
1390 1391
workerInstance.off("alert");
```
Z
zengyawen 已提交
1392 1393


1394 1395
### terminate<sup>(deprecated)</sup>

Z
zengyawen 已提交
1396 1397
terminate(): void

W
wangzhaoyong 已提交
1398
销毁Worker线程,终止Worker接收消息。
Z
zengyawen 已提交
1399

1400 1401 1402
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.terminate<sup>9+</sup>](#terminate9)替代。

Z
zengyawen 已提交
1403
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1404

Z
zengyawen 已提交
1405 1406
**示例:**

1407
```ts
Y
yqhan 已提交
1408
const workerInstance = new worker.Worker("workers/worker.ts");
Y
yqhan 已提交
1409
workerInstance.terminate();
Z
zengyawen 已提交
1410
```
Z
zengyawen 已提交
1411 1412


1413 1414
### onexit<sup>(deprecated)</sup>

Z
zengyawen 已提交
1415
onexit?: (code: number) =&gt; void
Z
zengyawen 已提交
1416

W
wangzhaoyong 已提交
1417
Worker对象的onexit属性表示Worker销毁时被调用的事件处理程序,处理程序在宿主线程中执行。
Z
zengyawen 已提交
1418

1419 1420 1421
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.onexit<sup>9+</sup>](#onexit9)替代。

Z
zengyawen 已提交
1422
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1423

Z
zengyawen 已提交
1424
**参数:**
Z
zengyawen 已提交
1425

Z
zengyawen 已提交
1426 1427
| 参数名 | 类型   | 必填 | 说明               |
| ------ | ------ | ---- | ------------------ |
1428
| code   | number | 是   | Worker退出的code。 |
Z
zengyawen 已提交
1429 1430 1431

**示例:**

1432
```ts
Y
yqhan 已提交
1433
const workerInstance = new worker.Worker("workers/worker.ts");
1434
workerInstance.onexit = () => {
Y
yqhan 已提交
1435
    console.log("onexit");
Z
zengyawen 已提交
1436
}
Y
yqhan 已提交
1437 1438

//onexit被执行两种方式:
Y
yqhan 已提交
1439
//main thread:
Y
yqhan 已提交
1440 1441 1442
workerInstance.terminate();

//worker线程:
Y
yqhan 已提交
1443
//parentPort.close()
Z
zengyawen 已提交
1444
```
Z
zengyawen 已提交
1445 1446


1447 1448
### onerror<sup>(deprecated)</sup>

Z
zengyawen 已提交
1449
onerror?: (err: ErrorEvent) =&gt; void
Z
zengyawen 已提交
1450

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

1453 1454 1455
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.onerror<sup>9+</sup>](#onerror9)替代。

Z
zengyawen 已提交
1456
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1457

Z
zengyawen 已提交
1458
**参数:**
Z
zengyawen 已提交
1459

Z
zengyawen 已提交
1460 1461
| 参数名 | 类型                      | 必填 | 说明       |
| ------ | ------------------------- | ---- | ---------- |
1462
| err    | [ErrorEvent](#errorevent) | 是   | 异常数据。 |
Z
zengyawen 已提交
1463 1464 1465

**示例:**

1466
```ts
Y
yqhan 已提交
1467
const workerInstance = new worker.Worker("workers/worker.ts");
1468
workerInstance.onerror = function() {
Y
yqhan 已提交
1469
    console.log("onerror");
Z
zengyawen 已提交
1470 1471
}
```
Z
zengyawen 已提交
1472 1473


1474 1475
### onmessage<sup>(deprecated)</sup>

Y
yqhan 已提交
1476
onmessage?: (event: MessageEvent) =&gt; void
Z
zengyawen 已提交
1477

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

1480 1481 1482
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.onmessage<sup>9+</sup>](#onmessage9)替代。

Z
zengyawen 已提交
1483
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1484

Z
zengyawen 已提交
1485 1486
**参数:**

Y
yqhan 已提交
1487 1488 1489
| 参数名 | 类型                           | 必填 | 说明                   |
| ------ | ------------------------------ | ---- | ---------------------- |
| event  | [MessageEvent](#messageeventt) | 是   | 收到的Worker消息数据。 |
Z
zengyawen 已提交
1490 1491

**示例:**
Z
zengyawen 已提交
1492

1493
```ts
Y
yqhan 已提交
1494
const workerInstance = new worker.Worker("workers/worker.ts");
1495
workerInstance.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
1496
    console.log("onmessage");
Z
zengyawen 已提交
1497 1498
}
```
Z
zengyawen 已提交
1499 1500


1501 1502
### onmessageerror<sup>(deprecated)</sup>

Y
yqhan 已提交
1503
onmessageerror?: (event: MessageEvent) =&gt; void
Z
zengyawen 已提交
1504

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

1507 1508 1509
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorker.onmessageerror<sup>9+</sup>](#onmessageerror9)替代。

Z
zengyawen 已提交
1510
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1511

Z
zengyawen 已提交
1512 1513
**参数:**

Y
yqhan 已提交
1514 1515 1516
| 参数名 | 类型                           | 必填 | 说明       |
| ------ | ------------------------------ | ---- | ---------- |
| event  | [MessageEvent](#messageeventt) | 是   | 异常数据。 |
Z
zengyawen 已提交
1517

Z
zengyawen 已提交
1518 1519
**示例:**

1520
```ts
Y
yqhan 已提交
1521
const workerInstance = new worker.Worker("workers/worker.ts");
1522
workerInstance.onmessageerror= () => {
Y
yqhan 已提交
1523
    console.log("onmessageerror");
Z
zengyawen 已提交
1524 1525
}
```
Z
zengyawen 已提交
1526 1527


1528 1529
## EventTarget<sup>(deprecated)</sup>
> **说明:**<br/>
1530
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[WorkerEventTarget<sup>9+</sup>](#workereventtarget9)替代。
Z
zengyawen 已提交
1531

1532
### addEventListener<sup>(deprecated)</sup>
Z
zengyawen 已提交
1533 1534

addEventListener(type: string, listener: EventListener): void
Z
zengyawen 已提交
1535

Y
yqhan 已提交
1536
向Worker添加一个事件监听,该接口与[on<sup>(deprecated)</sup>](#ondeprecated)接口功能一致。
Z
zengyawen 已提交
1537

1538 1539 1540
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[addEventListener<sup>9+</sup>](#addeventlistener9)替代。

Z
zengyawen 已提交
1541
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1542

Z
zengyawen 已提交
1543 1544
**参数:**

Z
zengyawen 已提交
1545 1546
| 参数名   | 类型                            | 必填 | 说明             |
| -------- | ------------------------------- | ---- | ---------------- |
W
wangzhaoyong 已提交
1547
| type     | string                          | 是   | 监听的事件类型。 |
Z
zengyawen 已提交
1548
| listener | [EventListener](#eventlistener) | 是   | 回调的事件。     |
Z
zengyawen 已提交
1549

Z
zengyawen 已提交
1550 1551
**示例:**

1552
```ts
Y
yqhan 已提交
1553
const workerInstance = new worker.Worker("workers/worker.ts");
1554
workerInstance.addEventListener("alert", ()=>{
Z
zengyawen 已提交
1555 1556 1557
    console.log("alert listener callback");
})
```
Z
zengyawen 已提交
1558 1559


1560 1561
### removeEventListener<sup>(deprecated)</sup>

Z
zengyawen 已提交
1562
removeEventListener(type: string, callback?: EventListener): void
Z
zengyawen 已提交
1563

Y
yqhan 已提交
1564
删除Worker的事件监听,该接口与[off<sup>(deprecated)</sup>](#offdeprecated)接口功能一致。
Z
zengyawen 已提交
1565

1566 1567 1568
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[removeEventListener<sup>9+</sup>](#removeeventlistener9)替代。

Z
zengyawen 已提交
1569
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1570

Z
zengyawen 已提交
1571
**参数:**
Z
zengyawen 已提交
1572

1573 1574
| 参数名   | 类型                            | 必填 | 说明                     |
| -------- | ------------------------------- | ---- | ------------------------ |
W
wangzhaoyong 已提交
1575
| type     | string                          | 是   | 需要删除的监听事件类型。 |
1576
| callback | [EventListener](#eventlistener) | 否   | 删除的回调事件。         |
Z
zengyawen 已提交
1577 1578 1579

**示例:**

1580
```ts
Y
yqhan 已提交
1581
const workerInstance = new worker.Worker("workers/worker.ts");
1582
workerInstance.addEventListener("alert", ()=>{
Y
yqhan 已提交
1583 1584
    console.log("alert listener callback");
})
Y
yqhan 已提交
1585
workerInstance.removeEventListener("alert");
Z
zengyawen 已提交
1586
```
Z
zengyawen 已提交
1587 1588


1589 1590
### dispatchEvent<sup>(deprecated)</sup>

Z
zengyawen 已提交
1591
dispatchEvent(event: Event): boolean
Z
zengyawen 已提交
1592

Z
zengyawen 已提交
1593 1594
分发定义在Worker的事件。

1595 1596 1597
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[dispatchEvent<sup>9+</sup>](#dispatchevent9)替代。

Z
zengyawen 已提交
1598
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1599

Z
zengyawen 已提交
1600 1601
**参数:**

Z
zengyawen 已提交
1602 1603 1604
| 参数名 | 类型            | 必填 | 说明             |
| ------ | --------------- | ---- | ---------------- |
| event  | [Event](#event) | 是   | 需要分发的事件。 |
Z
zengyawen 已提交
1605 1606

**返回值:**
Z
zengyawen 已提交
1607

Z
zengyawen 已提交
1608 1609
| 类型    | 说明                            |
| ------- | ------------------------------- |
Z
zengyawen 已提交
1610
| boolean | 分发的结果,false表示分发失败。 |
Z
zengyawen 已提交
1611

Z
zengyawen 已提交
1612 1613
**示例:**

1614
```ts
Y
yqhan 已提交
1615
const workerInstance = new worker.Worker("workers/worker.ts");
1616 1617 1618 1619 1620 1621

workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。
```

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

1622
```ts
Y
yqhan 已提交
1623
const workerInstance = new worker.Worker("workers/worker.ts");
Z
zengyawen 已提交
1624

Y
yqhan 已提交
1625 1626 1627 1628 1629 1630 1631 1632 1633 1634
//用法一:
workerInstance.on("alert_on", (e)=>{
    console.log("alert listener callback");
})
workerInstance.once("alert_once", (e)=>{
    console.log("alert listener callback");
})
workerInstance.addEventListener("alert_add", (e)=>{
    console.log("alert listener callback");
})
Z
zengyawen 已提交
1635

Y
yqhan 已提交
1636
//once接口创建的事件执行一次便会删除。
Y
yqhan 已提交
1637
workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
Y
yqhan 已提交
1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660
//on接口创建的事件可以一直被分发,不能主动删除。
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
//addEventListener接口创建的事件可以一直被分发,不能主动删除。
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});

//用法二:
//event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
//当type = "message",onmessage接口定义的方法同时会执行。
//当type = "messageerror",onmessageerror接口定义的方法同时会执行。
//当type = "error",onerror接口定义的方法同时会执行。
//若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。

workerInstance.addEventListener("message", (e)=>{
    console.log("message listener callback");
})
workerInstance.onmessage = function(e) {
    console.log("onmessage : message listener callback");
}
//调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
workerInstance.dispatchEvent({type:"message", timeStamp:0});
```
1661 1662
### removeAllListener<sup>(deprecated)</sup>

Z
zengyawen 已提交
1663
removeAllListener(): void
Z
zengyawen 已提交
1664

W
wangzhaoyong 已提交
1665
删除Worker所有的事件监听。
Z
zengyawen 已提交
1666

1667 1668 1669
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[removeAllListener<sup>9+</sup>](#removealllistener9)替代。

Z
zengyawen 已提交
1670
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1671

Z
zengyawen 已提交
1672 1673
**示例:**

1674
```ts
Y
yqhan 已提交
1675
const workerInstance = new worker.Worker("workers/worker.ts");
Y
yqhan 已提交
1676 1677 1678
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
Y
yqhan 已提交
1679
workerInstance.removeAllListener();
Z
zengyawen 已提交
1680
```
Z
zengyawen 已提交
1681 1682


1683 1684
## DedicatedWorkerGlobalScope<sup>(deprecated)</sup>

W
wangzhaoyong 已提交
1685
Worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口销毁Worker线程。DedicatedWorkerGlobalScope类继承[WorkerGlobalScope](#workerglobalscope)
Z
zengyawen 已提交
1686

1687 1688
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>](#threadworkerglobalscope9)替代。
Z
zengyawen 已提交
1689

Y
yqhan 已提交
1690 1691 1692 1693
### postMessage<sup>(deprecated)</sup>

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

Y
yqhan 已提交
1694
Worker线程通过转移对象所有权的方式向宿主线程发送消息。
Y
yqhan 已提交
1695 1696 1697 1698 1699 1700 1701 1702 1703 1704

> **说明:**<br/>
> 此接口暂不支持使用,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.postMessage<sup>9+</sup>](#postmessage9-2)替代。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名  | 类型                                      | 必填 | 说明                                                         |
| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
Y
yqhan 已提交
1705
| messageObject | Object                                    | 是   | 发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
Y
yqhan 已提交
1706 1707
| transfer| Transferable[]                            | 是   | 暂不支持该参数类型。                                         |

Y
yqhan 已提交
1708 1709 1710 1711
### postMessage<sup>9+</sup>

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

Y
yqhan 已提交
1712
Worker线程通过转移对象所有权的方式向宿主线程发送消息。
Y
yqhan 已提交
1713

Y
yqhan 已提交
1714 1715 1716
> **说明:**<br/>
> DedicatedWorkerGlobalScope类自API version 9 开始废弃,本接口建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.postMessage<sup>9+</sup>](#postmessage9-2)替代。

Y
yqhan 已提交
1717 1718 1719 1720
**系统能力:** SystemCapability.Utils.Lang

**参数:**

Y
yqhan 已提交
1721 1722 1723 1724
| 参数名   | 类型          | 必填 | 说明                                                         |
| -------- | ------------- | ---- | ------------------------------------------------------------ |
| message  | Object        | 是   | 发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
| transfer | ArrayBuffer[] | 是   | 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用,数组不可传入null。 |
Y
yqhan 已提交
1725 1726 1727

**示例:**

1728
```ts
Y
yqhan 已提交
1729
// main thread
Y
yqhan 已提交
1730
import worker from '@ohos.worker';
Y
yqhan 已提交
1731
const workerInstance = new worker.Worker("workers/worker.ts");
Y
yqhan 已提交
1732
workerInstance.postMessage("hello world");
1733
workerInstance.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
1734
    // let data = e.data;
Y
yqhan 已提交
1735
    console.log("receive data from worker.ts");
Y
yqhan 已提交
1736 1737
}
```
1738
```ts
Y
yqhan 已提交
1739
// worker.ts
Y
yqhan 已提交
1740
import worker from '@ohos.worker';
1741
const workerPort = worker.workerPort;
1742
workerPort.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
1743 1744
    // let data = e.data;
    let buffer = new ArrayBuffer(5)
1745
    workerPort.postMessage(buffer, [buffer]);
Y
yqhan 已提交
1746 1747 1748
}
```

1749 1750
### postMessage<sup>(deprecated)</sup>

Y
yqhan 已提交
1751
postMessage(messageObject: Object, options?: PostMessageOptions): void
Z
zengyawen 已提交
1752

Y
yqhan 已提交
1753
Worker线程通过转移对象所有权或者拷贝数据的方式向宿主线程发送消息。
Z
zengyawen 已提交
1754

1755
> **说明:**<br/>
Y
yqhan 已提交
1756
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.postMessage<sup>9+</sup>](#postmessage9-3)替代。
1757

Z
zengyawen 已提交
1758
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1759

Z
zengyawen 已提交
1760 1761
**参数:**

Z
zengyawen 已提交
1762 1763
| 参数名  | 类型                                      | 必填 | 说明                                                         |
| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
Y
yqhan 已提交
1764 1765
| message | Object                                    | 是   | 发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
| options | [PostMessageOptions](#postmessageoptions) | 否   | 当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用。<br/>若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到宿主线程。 |
Z
zengyawen 已提交
1766 1767 1768

**示例:**

1769
```ts
Y
yqhan 已提交
1770
// main thread
Z
zengyawen 已提交
1771
import worker from '@ohos.worker';
Y
yqhan 已提交
1772
const workerInstance = new worker.Worker("workers/worker.ts");
Y
yqhan 已提交
1773
workerInstance.postMessage("hello world");
1774
workerInstance.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
1775
    // let data = e.data;
Y
yqhan 已提交
1776
    console.log("receive data from worker.ts");
Z
zengyawen 已提交
1777 1778
}
```
1779
```ts
Y
yqhan 已提交
1780
// worker.ts
Z
zengyawen 已提交
1781 1782
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
1783
parentPort.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
1784
    // let data = e.data;
Y
yqhan 已提交
1785
    parentPort.postMessage("receive data from main thread");
Z
zengyawen 已提交
1786 1787
}
```
Z
zengyawen 已提交
1788

1789 1790
### close<sup>(deprecated)</sup>

Z
zengyawen 已提交
1791
close(): void
Z
zengyawen 已提交
1792

W
wangzhaoyong 已提交
1793
销毁Worker线程,终止Worker接收消息。
Z
zengyawen 已提交
1794

1795
> **说明:**<br/>
Y
yqhan 已提交
1796
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.close<sup>9+</sup>](#close9)替代。
1797

Z
zengyawen 已提交
1798
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1799

Z
zengyawen 已提交
1800 1801
**示例:**

1802
```ts
Y
yqhan 已提交
1803
// main thread
Z
zengyawen 已提交
1804
import worker from '@ohos.worker';
Y
yqhan 已提交
1805
const workerInstance = new worker.Worker("workers/worker.ts");
Z
zengyawen 已提交
1806
```
1807
```ts
Y
yqhan 已提交
1808
// worker.ts
Z
zengyawen 已提交
1809 1810
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
1811
parentPort.onmessage = (e: MessageEvents): void => {
Z
zengyawen 已提交
1812 1813 1814
    parentPort.close()
}
```
Z
zengyawen 已提交
1815 1816


1817 1818
### onmessage<sup>(deprecated)</sup>

Y
yqhan 已提交
1819
onmessage?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) =&gt; void
Z
zengyawen 已提交
1820

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

1823
> **说明:**<br/>
Y
yqhan 已提交
1824
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.onmessage<sup>9+</sup>](#onmessage9-1)替代。
1825

Z
zengyawen 已提交
1826
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1827

Z
zengyawen 已提交
1828 1829
**参数:**

Y
yqhan 已提交
1830 1831 1832
| 参数名 | 类型                                                         | 必填 | 说明                     |
| ------ | ------------------------------------------------------------ | ---- | ------------------------ |
| this   | [DedicatedWorkerGlobalScope](#dedicatedworkerglobalscopedeprecated) | 是   | 指向调用者对象。         |
Y
yqhan 已提交
1833
| ev     | [MessageEvent](#messageeventt)                               | 是   | 收到宿主线程发送的数据。 |
Z
zengyawen 已提交
1834 1835 1836

**示例:**

1837
```ts
Y
yqhan 已提交
1838
// main thread
Z
zengyawen 已提交
1839
import worker from '@ohos.worker';
Y
yqhan 已提交
1840
const workerInstance = new worker.Worker("workers/worker.ts");
Y
yqhan 已提交
1841
workerInstance.postMessage("hello world");
Z
zengyawen 已提交
1842
```
1843
```ts
Y
yqhan 已提交
1844
// worker.ts
Z
zengyawen 已提交
1845 1846
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
1847
parentPort.onmessage = (e: MessageEvents): void => {
Y
yqhan 已提交
1848
    console.log("receive main thread message");
Z
zengyawen 已提交
1849 1850
}
```
Z
zengyawen 已提交
1851 1852


1853 1854
### onmessageerror<sup>(deprecated)</sup>

Y
yqhan 已提交
1855
onmessageerror?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) =&gt; void
Z
zengyawen 已提交
1856

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

1859
> **说明:**<br/>
Y
yqhan 已提交
1860
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.onmessageerror<sup>9+</sup>](#onmessageerror9-1)替代。
1861

Z
zengyawen 已提交
1862
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1863

Z
zengyawen 已提交
1864 1865
**参数:**

Y
yqhan 已提交
1866 1867
| 参数名 | 类型                           | 必填 | 说明       |
| ------ | ------------------------------ | ---- | ---------- |
Y
yqhan 已提交
1868
| this   | [DedicatedWorkerGlobalScope](#dedicatedworkerglobalscopedeprecated) | 是   | 指向调用者对象。 |
Y
yqhan 已提交
1869
| ev     | [MessageEvent](#messageeventt) | 是   | 异常数据。 |
Z
zengyawen 已提交
1870 1871 1872

**示例:**

1873
```ts
Y
yqhan 已提交
1874
// main thread
Z
zengyawen 已提交
1875
import worker from '@ohos.worker';
Y
yqhan 已提交
1876
const workerInstance = new worker.Worker("workers/worker.ts");
Z
zengyawen 已提交
1877
```
1878
```ts
Y
yqhan 已提交
1879
// worker.ts
Z
zengyawen 已提交
1880 1881
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
1882
parentPort.onmessageerror = () => {
Y
yqhan 已提交
1883
    console.log("worker.ts onmessageerror")
Z
zengyawen 已提交
1884 1885
}
```
Z
zengyawen 已提交
1886 1887 1888


## PostMessageOptions
Z
zengyawen 已提交
1889

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

1892
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1893

1894
| 名称     | 类型     | 可读 | 可写 | 说明                              |
Z
zengyawen 已提交
1895
| -------- | -------- | ---- | ---- | --------------------------------- |
Y
yqhan 已提交
1896
| transfer | Object[] | 是   | 是   | ArrayBuffer数组,用于传递所有权。该数组中不可传入null。 |
Z
zengyawen 已提交
1897 1898 1899


## Event
Z
zengyawen 已提交
1900 1901 1902

事件类。

1903
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1904

Y
yqhan 已提交
1905 1906 1907 1908
| 名称      | 类型   | 可读 | 可写 | 说明                                         |
| --------- | ------ | ---- | ---- | -------------------------------------------- |
| type      | string | 是   | 否   | 指定事件的类型。                             |
| timeStamp | number | 是   | 否   | 事件创建时的时间戳(精度为毫秒),暂未支持。 |
Z
zengyawen 已提交
1909 1910


1911 1912
## EventListener<sup>(deprecated)</sup>

1913
(evt: Event): void | Promise&lt;void&gt;
Z
zengyawen 已提交
1914

1915
事件监听类。
Z
zengyawen 已提交
1916

1917 1918 1919
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[WorkerEventListener<sup>9+</sup>](#workereventlistener9)替代。

Z
zengyawen 已提交
1920 1921
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
1922
**参数:**
Z
zengyawen 已提交
1923

Z
zengyawen 已提交
1924 1925 1926
| 参数名 | 类型            | 必填 | 说明           |
| ------ | --------------- | ---- | -------------- |
| evt    | [Event](#event) | 是   | 回调的事件类。 |
Z
zengyawen 已提交
1927

Z
zengyawen 已提交
1928 1929
**返回值:**

Z
zengyawen 已提交
1930 1931
| 类型                                  | 说明                            |
| ------------------------------------- | ------------------------------- |
Z
zengyawen 已提交
1932 1933 1934 1935
| void&nbsp;\|&nbsp;Promise&lt;void&gt; | 无返回值或者以Promise形式返回。 |

**示例:**

1936
```ts
Y
yqhan 已提交
1937
const workerInstance = new worker.Worker("workers/worker.ts");
1938
workerInstance.addEventListener("alert", ()=>{
Z
zengyawen 已提交
1939 1940 1941
    console.log("alert listener callback");
})
```
Z
zengyawen 已提交
1942 1943 1944 1945


## ErrorEvent

Z
zengyawen 已提交
1946 1947
错误事件类,用于表示Worker执行过程中出现异常的详细信息,ErrorEvent类继承[Event](#event)

1948
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1949

1950 1951 1952 1953 1954 1955 1956
| 名称     | 类型   | 可读 | 可写 | 说明                 |
| -------- | ------ | ---- | ---- | -------------------- |
| message  | string | 是   | 否   | 异常发生的错误信息。 |
| filename | string | 是   | 否   | 出现异常所在的文件。 |
| lineno   | number | 是   | 否   | 异常所在的行数。     |
| colno    | number | 是   | 否   | 异常所在的列数。     |
| error    | Object | 是   | 否   | 异常类型。           |
Z
zengyawen 已提交
1957 1958


1959
## MessageEvent\<T\>
Z
zengyawen 已提交
1960

Z
zengyawen 已提交
1961
消息类,持有Worker线程间传递的数据。
Z
zengyawen 已提交
1962

1963
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1964

1965
| 名称 | 类型 | 可读 | 可写 | 说明               |
1966 1967
| ---- | ---- | ---- | ---- | ------------------ |
| data | T    | 是   | 否   | 线程间传递的数据。 |
Z
zengyawen 已提交
1968 1969


1970 1971
## WorkerGlobalScope<sup>(deprecated)</sup>

Z
zengyawen 已提交
1972
Worker线程自身的运行环境,WorkerGlobalScope类继承[EventTarget](#eventtarget)
Z
zengyawen 已提交
1973

1974 1975 1976
> **说明:**<br/>
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[GlobalScope<sup>9+</sup>](#globalscope9)替代。

Z
zengyawen 已提交
1977
### 属性
Z
zengyawen 已提交
1978

1979
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1980

1981
| 名称 | 类型                                                         | 可读 | 可写 | 说明                                  |
1982
| ---- | ------------------------------------------------------------ | ---- | ---- | ------------------------------------- |
W
wangzhaoyong 已提交
1983
| name | string                                                       | 是   | 否   | Worker的名字,new&nbsp;Worker时指定。 |
1984 1985
| self | [WorkerGlobalScope](#workerglobalscope)&nbsp;&amp;&nbsp;typeof&nbsp;globalThis | 是   | 否   | WorkerGlobalScope本身。               |

Z
zengyawen 已提交
1986

1987
### onerror<sup>(deprecated)</sup>
Z
zengyawen 已提交
1988 1989 1990

onerror?: (ev: ErrorEvent) =&gt; void

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

1993
> **说明:**<br/>
Y
yqhan 已提交
1994
> 从API version 7 开始支持,从API version 9 开始废弃,建议使用[GlobalScope<sup>9+</sup>.onerror<sup>9+</sup>](#onerror9-1)替代。
1995

Z
zengyawen 已提交
1996
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
1997

Z
zengyawen 已提交
1998 1999
**参数:**

Z
zengyawen 已提交
2000 2001
| 参数名 | 类型                      | 必填 | 说明       |
| ------ | ------------------------- | ---- | ---------- |
2002
| ev     | [ErrorEvent](#errorevent) | 是   | 异常数据。 |
Z
zengyawen 已提交
2003 2004

**示例:**
Z
zengyawen 已提交
2005

2006
```ts
Y
yqhan 已提交
2007
// main thread
Z
zengyawen 已提交
2008
import worker from '@ohos.worker';
Y
yqhan 已提交
2009
const workerInstance = new worker.Worker("workers/worker.ts")
Z
zengyawen 已提交
2010
```
2011
```ts
Y
yqhan 已提交
2012
// worker.ts
Z
zengyawen 已提交
2013 2014
import worker from '@ohos.worker';
const parentPort = worker.parentPort
2015
parentPort.onerror = () => {
Y
yqhan 已提交
2016
    console.log("worker.ts onerror")
Z
zengyawen 已提交
2017
}
Y
yqhan 已提交
2018 2019
```

2020

W
wangzhaoyong 已提交
2021 2022
## 其他说明

W
wangzhaoyong 已提交
2023
### 序列化支持类型
2024 2025

序列化支持类型包括:除Symbol之外的基础类型、Date、String、RegExp、Array、Map、Set、Object(仅限简单对象,比如通过"{}"或者"new Object"创建,普通对象仅支持传递属性,不支持传递其原型及方法)、ArrayBuffer、TypedArray。
W
wangzhaoyong 已提交
2026

2027
特例:传递通过自定义class创建出来的object时,不会发生序列化错误,但是自定义class的属性(如Function)无法通过序列化传递。
2028 2029 2030
> **说明:**<br/>
> 以API version 9的FA工程为例。

2031
```ts
Y
yqhan 已提交
2032
// main thread
2033
import worker, { MessageEvents } from '@ohos.worker';
Y
yqhan 已提交
2034 2035
const workerInstance = new worker.ThreadWorker("workers/worker.ts");
workerInstance.postMessage("message from main thread to worker");
2036
workerInstance.onmessage = (d: MessageEvents): void => {
2037
  // 当worker线程传递obj2时,data即为obj2。data没有Init、SetName的方法
2038
  let data: string  = d.data;
2039 2040
}
```
2041
```ts
Y
yqhan 已提交
2042
// worker.ts
2043
import worker, { MessageEvents } from '@ohos.worker';
Y
yqhan 已提交
2044
const workerPort = worker.workerPort;
2045
class MyModel {
小马奔腾 已提交
2046
    name = "undefined"
2047
    Init() {
W
wangzhaoyong 已提交
2048
        this.name = "MyModel"
2049 2050
    }
}
2051
workerPort.onmessage = (d: MessageEvents): void => {
Y
yqhan 已提交
2052
    console.log("worker.ts onmessage");
2053 2054
    let data: string = d.data;
    let func1 = () => {
2055 2056 2057 2058 2059 2060 2061 2062 2063 2064
        console.log("post message is function");
    }
    let obj1 = {
        "index": 2,
        "name1": "zhangshan",
        setName() {
            this.index = 3;
        }
    }
    let obj2 = new MyModel();
Y
yqhan 已提交
2065 2066 2067
    // workerPort.postMessage(func1); 传递func1发生序列化错误
    // workerPort.postMessage(obj1);  传递obj1发生序列化错误
    workerPort.postMessage(obj2);     // 传递obj2不会发生序列化错误
2068
}
2069
workerPort.onmessageerror = () => {
Y
yqhan 已提交
2070
    console.log("worker.ts onmessageerror");
2071
}
2072
workerPort.onerror = () => {
Y
yqhan 已提交
2073
    console.log("worker.ts onerror");
2074 2075 2076
}
```

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

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

Y
yqhan 已提交
2082
## 完整示例
2083 2084
> **说明:**<br/>
> 以API version 9的工程为例。<br> API version 8及之前的版本仅支持FA模型,如需使用,注意更换构造Worker的接口和创建worker线程中与主线程通信的对象的两个方法。
Y
yqhan 已提交
2085
### FA模型
2086

2087
```ts
Y
yqhan 已提交
2088
// main thread(同级目录为例)
2089
import worker, { MessageEvents } from '@ohos.worker';
W
wangzhaoyong 已提交
2090
// 主线程中创建Worker对象
2091
const workerInstance = new worker.ThreadWorker("workers/worker.ts");
Y
yqhan 已提交
2092

W
wangzhaoyong 已提交
2093
// 主线程向worker线程传递信息
Y
yqhan 已提交
2094
workerInstance.postMessage("123");
W
wangzhaoyong 已提交
2095 2096

// 主线程接收worker线程信息
2097
workerInstance.onmessage = (e: MessageEvents): void => {
W
wangzhaoyong 已提交
2098
    // data:worker线程发送的信息
2099
    let data: string = e.data;
Y
yqhan 已提交
2100
    console.log("main thread onmessage");
W
wangzhaoyong 已提交
2101 2102

    // 销毁Worker对象
Y
yqhan 已提交
2103 2104
    workerInstance.terminate();
}
W
wangzhaoyong 已提交
2105 2106

// 在调用terminate后,执行回调onexit
2107
workerInstance.onexit = () => {
Y
yqhan 已提交
2108
    console.log("main thread terminate");
Y
yqhan 已提交
2109 2110
}
```
2111
```ts
2112
// worker.ts
2113
import worker, { MessageEvents } from '@ohos.worker';
W
wangzhaoyong 已提交
2114 2115

// 创建worker线程中与主线程通信的对象
Y
yqhan 已提交
2116
const workerPort = worker.workerPort
2117

W
wangzhaoyong 已提交
2118
// worker线程接收主线程信息
2119
workerPort.onmessage = (e: MessageEvents): void => {
W
wangzhaoyong 已提交
2120
    // data:主线程发送的信息
2121
    let data: string = e.data;
2122
    console.log("worker.ts onmessage");
W
wangzhaoyong 已提交
2123 2124

    // worker线程向主线程发送信息
Y
yqhan 已提交
2125
    workerPort.postMessage("123")
Y
yqhan 已提交
2126 2127
}

W
wangzhaoyong 已提交
2128
// worker线程发生error的回调
2129
workerPort.onerror= () => {
2130
    console.log("worker.ts onerror");
Y
yqhan 已提交
2131 2132 2133 2134 2135 2136 2137
}
```
build-profile.json5 配置 :
```json
  "buildOption": {
    "sourceOption": {
      "workers": [
2138
        "./src/main/ets/entryability/workers/worker.ts"
Y
yqhan 已提交
2139 2140 2141 2142 2143
      ]
    }
  }
```
### Stage模型
2144
```ts
Y
yqhan 已提交
2145
// main thread(以不同目录为例)
2146
import worker, { MessageEvents } from '@ohos.worker';
W
wangzhaoyong 已提交
2147 2148

// 主线程中创建Worker对象
2149
const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.ts");
W
wangzhaoyong 已提交
2150 2151

// 主线程向worker线程传递信息
Y
yqhan 已提交
2152
workerInstance.postMessage("123");
W
wangzhaoyong 已提交
2153 2154

// 主线程接收worker线程信息
2155
workerInstance.onmessage = (e: MessageEvents): void => {
W
wangzhaoyong 已提交
2156
    // data:worker线程发送的信息
2157
    let data: string = e.data;
Y
yqhan 已提交
2158
    console.log("main thread onmessage");
W
wangzhaoyong 已提交
2159 2160

    // 销毁Worker对象
Y
yqhan 已提交
2161 2162 2163
    workerInstance.terminate();
}
// 在调用terminate后,执行onexit
2164
workerInstance.onexit = () => {
Y
yqhan 已提交
2165
    console.log("main thread terminate");
Y
yqhan 已提交
2166 2167
}
```
2168
```ts
2169
// worker.ts
2170
import worker, { MessageEvents } from '@ohos.worker';
W
wangzhaoyong 已提交
2171 2172

// 创建worker线程中与主线程通信的对象
Y
yqhan 已提交
2173
const workerPort = worker.workerPort
Y
yqhan 已提交
2174

W
wangzhaoyong 已提交
2175
// worker线程接收主线程信息
2176
workerPort.onmessage = (e: MessageEvents): void => {
W
wangzhaoyong 已提交
2177
    // data:主线程发送的信息
2178
    let data: string = e.data;
2179
    console.log("worker.ts onmessage");
W
wangzhaoyong 已提交
2180 2181

    // worker线程向主线程发送信息
Y
yqhan 已提交
2182
    workerPort.postMessage("123")
Y
yqhan 已提交
2183 2184
}

W
wangzhaoyong 已提交
2185
// worker线程发生error的回调
2186
workerPort.onerror= () => {
2187
    console.log("worker.ts onerror");
Y
yqhan 已提交
2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198
}
```
build-profile.json5 配置:
```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/pages/workers/worker.ts"
      ]
    }
  }
Y
yqhan 已提交
2199 2200
```
<!--no_check-->