js-apis-worker.md 23.7 KB
Newer Older
Z
zengyawen 已提交
1
# 启动一个Worker
Z
zengyawen 已提交
2

Z
zengyawen 已提交
3 4
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
Z
zengyawen 已提交
5

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

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

Y
yqhan 已提交
10
```js
Z
zengyawen 已提交
11 12 13
import worker from '@ohos.worker';
```

Z
zengyawen 已提交
14 15 16

## 属性

17
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
18 19 20 21

| 名称       | 参数类型                                                  | 可读 | 可写 | 说明                                 |
| ---------- | --------------------------------------------------------- | ---- | ---- | ------------------------------------ |
| parentPort | [DedicatedWorkerGlobalScope](#dedicatedworkerglobalscope) | 是   | 是   | worker线程用于与宿主线程通信的对象。 |
Z
zengyawen 已提交
22 23 24


## WorkerOptions
Z
zengyawen 已提交
25

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

28
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
29

Y
yqhan 已提交
30 31 32 33
| 名称   | 参数类型  | 可读 | 可写 | 说明                   |
| ------ | --------- | ---- | ---- | ---------------------- |
| name   | string    | 是   | 是   | Worker的名称。         |
| shared | boolean   | 是   | 是   | Worker是否可以被分享。 |
Z
zengyawen 已提交
34 35 36 37


## Worker

Z
zengyawen 已提交
38
使用以下方法前,均需先构造Worker实例,Worker类继承[EventTarget](#eventtarget)
Z
zengyawen 已提交
39 40 41 42 43


### constructor

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

Z
zengyawen 已提交
45 46 47
Worker构造函数。

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

Z
zengyawen 已提交
49 50
**参数:**

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

Z
zengyawen 已提交
56
**返回值:**
Z
zengyawen 已提交
57

Z
zengyawen 已提交
58 59 60
| 类型   | 说明                                                      |
| ------ | --------------------------------------------------------- |
| Worker | 执行Worker构造函数生成的Worker对象,失败则返回undefined。 |
Z
zengyawen 已提交
61 62 63

**示例:**

Y
yqhan 已提交
64
```js
W
wangzhaoyong 已提交
65
import worker from '@ohos.worker';
Y
yqhan 已提交
66 67 68
// worker线程创建

// FA模型-目录同级
W
wangzhaoyong 已提交
69
const workerFAModel01 = new worker.Worker("workers/worker.js", {name:"first worker"});
Y
yqhan 已提交
70
// FA模型-目录不同级(以workers目录放置pages目录前一级为例)
W
wangzhaoyong 已提交
71
const workerFAModel02 = new worker.Worker("../workers/worker.js", {name:"first worker"});
Y
yqhan 已提交
72 73

// Stage模型-目录同级
W
wangzhaoyong 已提交
74
const workerStageModel01 = new worker.Worker('entry/ets/workers/worker.ts');
Y
yqhan 已提交
75
// Stage模型-目录不同级(以workers目录放置pages目录后一级为例)
W
wangzhaoyong 已提交
76
const workerStageModel02 = new worker.Worker('entry/ets/pages/workers/worker.ts');
Y
yqhan 已提交
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

// scriptURL——"entry/ets/workers/worker.ts"的解释:
// entry: 为module.json5中module中name属性的值;
// ets: 表明当前使用的语言。
```
同时,需在工程目录下build-profile.json5文件的buildOption属性中添加配置信息,主要分为下面两种情况:

(1) 目录同级( **不添加也可以** )
FA模型:

```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/MainAbility/workers/worker.ts"
      ]
    }
  }
```
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"
      ]
    }
  }
Z
zengyawen 已提交
126
```
Z
zengyawen 已提交
127 128 129
### postMessage

postMessage(message: Object, options?: PostMessageOptions): void
Z
zengyawen 已提交
130

Z
zengyawen 已提交
131 132 133
向Worker线程发送消息,数据的传输采用结构化克隆算法。

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

Z
zengyawen 已提交
135 136
**参数:**

Z
zengyawen 已提交
137 138 139 140
| 参数名  | 类型                                      | 必填 | 说明                                                         |
| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
| message | Object                                    | 是   | 发送至Worker的数据。                                         |
| options | [PostMessageOptions](#postmessageoptions) | 否   | 可转移对象是&nbsp;ArrayBuffer&nbsp;的实例对象。transferList数组中不可传入null。 |
Z
zengyawen 已提交
141

Z
zengyawen 已提交
142 143
**示例:**

Y
yqhan 已提交
144
```js
Z
zengyawen 已提交
145
const workerInstance = new worker.Worker("workers/worker.js");
W
wangzhaoyong 已提交
146

Z
zengyawen 已提交
147
workerInstance.postMessage("hello world");
W
wangzhaoyong 已提交
148

Z
zengyawen 已提交
149 150 151
var buffer = new ArrayBuffer(8);
workerInstance.postMessage(buffer, [buffer]);
```
Z
zengyawen 已提交
152 153 154 155 156


### on

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

Z
zengyawen 已提交
158 159 160
向Worker添加一个事件监听。

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

Z
zengyawen 已提交
162
**参数:**
Z
zengyawen 已提交
163

Z
zengyawen 已提交
164 165 166 167
| 参数名   | 类型                            | 必填 | 说明             |
| -------- | ------------------------------- | ---- | ---------------- |
| type     | string                          | 是   | 监听事件的type。 |
| listener | [EventListener](#eventlistener) | 是   | 回调的事件。     |
Z
zengyawen 已提交
168 169 170

**示例:**

Y
yqhan 已提交
171 172
```js
const workerInstance = new worker.Worker("workers/worker.js");
Z
zengyawen 已提交
173 174 175 176
workerInstance.on("alert", (e)=>{
    console.log("alert listener callback");
})
```
Z
zengyawen 已提交
177 178 179 180 181


### once

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

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

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

Z
zengyawen 已提交
187
**参数:**
Z
zengyawen 已提交
188

Z
zengyawen 已提交
189 190 191 192
| 参数名   | 类型                            | 必填 | 说明             |
| -------- | ------------------------------- | ---- | ---------------- |
| type     | string                          | 是   | 监听事件的type。 |
| listener | [EventListener](#eventlistener) | 是   | 回调的事件。     |
Z
zengyawen 已提交
193 194 195

**示例:**

Y
yqhan 已提交
196
```js
Z
zengyawen 已提交
197 198 199 200 201
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.once("alert", (e)=>{
    console.log("alert listener callback");
})
```
Z
zengyawen 已提交
202 203 204 205 206


### off

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

Z
zengyawen 已提交
208 209 210
删除Worker的事件监听。

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

Z
zengyawen 已提交
212
**参数:**
Z
zengyawen 已提交
213

Z
zengyawen 已提交
214 215 216 217
| 参数名   | 类型                            | 必填 | 说明                   |
| -------- | ------------------------------- | ---- | ---------------------- |
| type     | string                          | 是   | 需要删除事件的type。   |
| listener | [EventListener](#eventlistener) | 否   | 需要删除的回调的事件。 |
Z
zengyawen 已提交
218 219 220

**示例:**

Y
yqhan 已提交
221
```js
Z
zengyawen 已提交
222 223 224
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.off("alert");
```
Z
zengyawen 已提交
225 226


Z
zengyawen 已提交
227
### terminate
Z
zengyawen 已提交
228

Z
zengyawen 已提交
229 230
terminate(): void

Z
zengyawen 已提交
231 232 233
关闭Worker线程,终止Worker接收消息。

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

Z
zengyawen 已提交
235 236
**示例:**

Y
yqhan 已提交
237 238 239
```js
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.terminate();
Z
zengyawen 已提交
240
```
Z
zengyawen 已提交
241 242


Z
zengyawen 已提交
243 244 245
### onexit

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

Z
zengyawen 已提交
247 248 249
Worker对象的onexit属性表示Worker退出时被调用的事件处理程序,处理程序在宿主线程中执行。

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

Z
zengyawen 已提交
251
**参数:**
Z
zengyawen 已提交
252

Z
zengyawen 已提交
253 254 255
| 参数名 | 类型   | 必填 | 说明               |
| ------ | ------ | ---- | ------------------ |
| code   | number | 否   | Worker退出的code。 |
Z
zengyawen 已提交
256 257 258

**示例:**

Y
yqhan 已提交
259 260
```js
const workerInstance = new worker.Worker("workers/worker.js");
Z
zengyawen 已提交
261
workerInstance.onexit = function(e) {
Y
yqhan 已提交
262
    console.log("onexit");
Z
zengyawen 已提交
263 264
}
```
Z
zengyawen 已提交
265 266 267 268 269


### onerror

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

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

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

Z
zengyawen 已提交
275
**参数:**
Z
zengyawen 已提交
276

Z
zengyawen 已提交
277 278 279
| 参数名 | 类型                      | 必填 | 说明       |
| ------ | ------------------------- | ---- | ---------- |
| err    | [ErrorEvent](#errorevent) | 否   | 异常数据。 |
Z
zengyawen 已提交
280 281 282

**示例:**

Y
yqhan 已提交
283 284
```js
const workerInstance = new worker.Worker("workers/worker.js");
Z
zengyawen 已提交
285
workerInstance.onerror = function(e) {
Y
yqhan 已提交
286
    console.log("onerror");
Z
zengyawen 已提交
287 288
}
```
Z
zengyawen 已提交
289 290 291 292


### onmessage

W
wangzhaoyong 已提交
293
onmessage?: (event: MessageEvent\<T>) =&gt; void
Z
zengyawen 已提交
294

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

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

Z
zengyawen 已提交
299 300
**参数:**

Z
zengyawen 已提交
301 302 303
| 参数名 | 类型                          | 必填 | 说明                   |
| ------ | ----------------------------- | ---- | ---------------------- |
| event  | [MessageEvent](#messageevent) | 否   | 收到的Worker消息数据。 |
Z
zengyawen 已提交
304 305

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

Y
yqhan 已提交
307 308
```js
const workerInstance = new worker.Worker("workers/worker.js");
Z
zengyawen 已提交
309
workerInstance.onmessage = function(e) {
Y
yqhan 已提交
310 311 312
    // e : MessageEvent<T>, 用法如下:
    // let data = e.data;
    console.log("onmessage");
Z
zengyawen 已提交
313 314
}
```
Z
zengyawen 已提交
315 316 317 318


### onmessageerror

W
wangzhaoyong 已提交
319
onmessageerror?: (event: MessageEvent\<T>) =&gt; void
Z
zengyawen 已提交
320

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

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

Z
zengyawen 已提交
325 326
**参数:**

Z
zengyawen 已提交
327 328 329
| 参数名 | 类型                          | 必填 | 说明       |
| ------ | ----------------------------- | ---- | ---------- |
| event  | [MessageEvent](#messageevent) | 否   | 异常数据。 |
Z
zengyawen 已提交
330

Z
zengyawen 已提交
331 332
**示例:**

Y
yqhan 已提交
333 334
```js
const workerInstance = new worker.Worker("workers/worker.js");
Z
zengyawen 已提交
335
workerInstance.onmessageerror= function(e) {
Y
yqhan 已提交
336
    console.log("onmessageerror");
Z
zengyawen 已提交
337 338
}
```
Z
zengyawen 已提交
339 340 341 342 343 344 345 346


## EventTarget


### addEventListener

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

Z
zengyawen 已提交
348 349 350
向Worker添加一个事件监听。

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

Z
zengyawen 已提交
352 353
**参数:**

Z
zengyawen 已提交
354 355 356 357
| 参数名   | 类型                            | 必填 | 说明             |
| -------- | ------------------------------- | ---- | ---------------- |
| type     | string                          | 是   | 监听事件的type。 |
| listener | [EventListener](#eventlistener) | 是   | 回调的事件。     |
Z
zengyawen 已提交
358

Z
zengyawen 已提交
359 360
**示例:**

Y
yqhan 已提交
361 362
```js
const workerInstance = new worker.Worker("workers/worker.js");
Z
zengyawen 已提交
363 364 365 366
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
```
Z
zengyawen 已提交
367 368 369 370 371


### removeEventListener

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

Z
zengyawen 已提交
373 374 375
删除Worker的事件监听。

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

Z
zengyawen 已提交
377
**参数:**
Z
zengyawen 已提交
378

Z
zengyawen 已提交
379 380 381 382
| 参数名   | 类型                            | 必填 | 说明                   |
| -------- | ------------------------------- | ---- | ---------------------- |
| type     | string                          | 是   | 需要删除事件的type。   |
| callback | [EventListener](#eventlistener) | 否   | 需要删除的回调的事件。 |
Z
zengyawen 已提交
383 384 385

**示例:**

Y
yqhan 已提交
386 387 388
```js
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.removeEventListener("alert");
Z
zengyawen 已提交
389
```
Z
zengyawen 已提交
390 391 392 393 394


### dispatchEvent

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

Z
zengyawen 已提交
396 397 398
分发定义在Worker的事件。

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

Z
zengyawen 已提交
400 401
**参数:**

Z
zengyawen 已提交
402 403 404
| 参数名 | 类型            | 必填 | 说明             |
| ------ | --------------- | ---- | ---------------- |
| event  | [Event](#event) | 是   | 需要分发的事件。 |
Z
zengyawen 已提交
405 406

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

Z
zengyawen 已提交
408 409
| 类型    | 说明                            |
| ------- | ------------------------------- |
Z
zengyawen 已提交
410
| boolean | 分发的结果,false表示分发失败。 |
Z
zengyawen 已提交
411

Z
zengyawen 已提交
412 413
**示例:**

Y
yqhan 已提交
414 415 416
```js
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.dispatchEvent({type:"alert"});
Z
zengyawen 已提交
417
```
Z
zengyawen 已提交
418 419 420 421 422


### removeAllListener

removeAllListener(): void
Z
zengyawen 已提交
423

Z
zengyawen 已提交
424 425 426
删除Worker的所有事件监听。

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

Z
zengyawen 已提交
428 429
**示例:**

Y
yqhan 已提交
430 431 432
```js
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.removeAllListener();
Z
zengyawen 已提交
433
```
Z
zengyawen 已提交
434 435


Z
zengyawen 已提交
436
## DedicatedWorkerGlobalScope
Z
zengyawen 已提交
437

Z
zengyawen 已提交
438
Worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口关闭Worker线程,DedicatedWorkerGlobalScope类继承[WorkerGlobalScope](#workerglobalscope)
Z
zengyawen 已提交
439 440


Z
zengyawen 已提交
441
### postMessage
Z
zengyawen 已提交
442

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

Z
zengyawen 已提交
445 446 447
Worker向宿主线程发送消息。

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

Z
zengyawen 已提交
449 450
**参数:**

Z
zengyawen 已提交
451 452 453 454
| 参数名  | 类型                                      | 必填 | 说明                                                         |
| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
| message | Object                                    | 是   | 发送至Worker的数据。                                         |
| options | [PostMessageOptions](#postmessageoptions) | 否   | 可转移对象是ArrayBuffer的实例对象。transferList数组中不可传入null。 |
Z
zengyawen 已提交
455 456 457

**示例:**

Y
yqhan 已提交
458
```js
Z
zengyawen 已提交
459 460
// main.js
import worker from '@ohos.worker';
Y
yqhan 已提交
461 462
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.postMessage("hello world");
Z
zengyawen 已提交
463
workerInstance.onmessage = function(e) {
Y
yqhan 已提交
464 465
    // let data = e.data;
    console.log("receive data from worker.js");
Z
zengyawen 已提交
466 467
}
```
Y
yqhan 已提交
468
```js
Z
zengyawen 已提交
469 470 471 472
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessage = function(e){
Y
yqhan 已提交
473 474
    // let data = e.data;
    parentPort.postMessage("receive data from main.js");
Z
zengyawen 已提交
475 476
}
```
Z
zengyawen 已提交
477 478 479 480 481


### close

close(): void
Z
zengyawen 已提交
482

Z
zengyawen 已提交
483 484 485
关闭Worker线程,终止Worker接收消息。

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

Z
zengyawen 已提交
487 488
**示例:**

Y
yqhan 已提交
489
```js
Z
zengyawen 已提交
490 491
// main.js
import worker from '@ohos.worker';
Y
yqhan 已提交
492
const workerInstance = new worker.Worker("workers/worker.js");
Z
zengyawen 已提交
493
```
Y
yqhan 已提交
494
```js
Z
zengyawen 已提交
495 496 497 498 499 500 501
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessage = function(e) {
    parentPort.close()
}
```
Z
zengyawen 已提交
502 503


Z
zengyawen 已提交
504
### onmessage
Z
zengyawen 已提交
505

W
wangzhaoyong 已提交
506
onmessage?: (event: MessageEvent\<T>) =&gt; void
Z
zengyawen 已提交
507

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

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

Z
zengyawen 已提交
512 513
**参数:**

Z
zengyawen 已提交
514 515 516
| 参数名 | 类型                          | 必填 | 说明                   |
| ------ | ----------------------------- | ---- | ---------------------- |
| event  | [MessageEvent](#messageevent) | 否   | 收到的Worker消息数据。 |
Z
zengyawen 已提交
517 518 519

**示例:**

Y
yqhan 已提交
520
```js
Z
zengyawen 已提交
521 522
// main.js
import worker from '@ohos.worker';
Y
yqhan 已提交
523 524
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.postMessage("hello world");
Z
zengyawen 已提交
525
```
Y
yqhan 已提交
526
```js
Z
zengyawen 已提交
527 528 529 530
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessage = function(e) {
Y
yqhan 已提交
531
    console.log("receive main.js message");
Z
zengyawen 已提交
532 533
}
```
Z
zengyawen 已提交
534 535 536 537


### onmessageerror

W
wangzhaoyong 已提交
538
onmessageerror?: (event: MessageEvent\<T>) =&gt; void
Z
zengyawen 已提交
539

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

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

Z
zengyawen 已提交
544 545
**参数:**

Z
zengyawen 已提交
546 547 548
| 参数名 | 类型                          | 必填 | 说明       |
| ------ | ----------------------------- | ---- | ---------- |
| event  | [MessageEvent](#messageevent) | 否   | 异常数据。 |
Z
zengyawen 已提交
549 550 551

**示例:**

Y
yqhan 已提交
552
```js
Z
zengyawen 已提交
553 554
// main.js
import worker from '@ohos.worker';
Y
yqhan 已提交
555
const workerInstance = new worker.Worker("workers/worker.js");
Z
zengyawen 已提交
556
```
Y
yqhan 已提交
557
```js
Z
zengyawen 已提交
558 559 560 561 562 563 564
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessageerror= function(e) {
    console.log("worker.js onmessageerror")
}
```
Z
zengyawen 已提交
565 566 567


## PostMessageOptions
Z
zengyawen 已提交
568 569 570

明确数据传递过程中需要转移所有权对象的类,传递所有权的对象必须是ArrayBuffer。

571
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
572 573 574 575

| 名称     | 参数类型 | 可读 | 可写 | 说明                              |
| -------- | -------- | ---- | ---- | --------------------------------- |
| transfer | Object[] | 是   | 是   | ArrayBuffer数组,用于传递所有权。 |
Z
zengyawen 已提交
576 577 578


## Event
Z
zengyawen 已提交
579 580 581

事件类。

582
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
583 584 585 586 587

| 名称      | 参数类型 | 可读 | 可写 | 说明                               |
| --------- | -------- | ---- | ---- | ---------------------------------- |
| type      | string   | 是   | 否   | 指定事件的type。                   |
| timeStamp | number   | 是   | 否   | 事件创建时的时间戳(精度为毫秒)。 |
Z
zengyawen 已提交
588 589 590


## EventListener
Z
zengyawen 已提交
591 592 593

事件监听类。

594
(evt: Event): void | Promise&lt;void&gt;
Z
zengyawen 已提交
595 596 597

执行的回调函数。

Z
zengyawen 已提交
598 599
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
600
**参数:**
Z
zengyawen 已提交
601

Z
zengyawen 已提交
602 603 604
| 参数名 | 类型            | 必填 | 说明           |
| ------ | --------------- | ---- | -------------- |
| evt    | [Event](#event) | 是   | 回调的事件类。 |
Z
zengyawen 已提交
605

Z
zengyawen 已提交
606 607
**返回值:**

Z
zengyawen 已提交
608 609
| 类型                                  | 说明                            |
| ------------------------------------- | ------------------------------- |
Z
zengyawen 已提交
610 611 612 613
| void&nbsp;\|&nbsp;Promise&lt;void&gt; | 无返回值或者以Promise形式返回。 |

**示例:**

Y
yqhan 已提交
614
```js
Z
zengyawen 已提交
615 616 617 618 619
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
```
Z
zengyawen 已提交
620 621 622 623


## ErrorEvent

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

626
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
627

Z
zengyawen 已提交
628 629 630 631 632 633 634
| 名称     | 参数类型 | 可读 | 可写 | 说明                 |
| -------- | -------- | ---- | ---- | -------------------- |
| message  | string   | 是   | 否   | 异常发生的错误信息。 |
| filename | string   | 是   | 否   | 出现异常所在的文件。 |
| lineno   | number   | 是   | 否   | 异常所在的行数。     |
| colno    | number   | 是   | 否   | 异常所在的列数。     |
| error    | Object   | 是   | 否   | 异常类型。           |
Z
zengyawen 已提交
635 636 637


## MessageEvent
Z
zengyawen 已提交
638

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

641
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
642

Z
zengyawen 已提交
643 644 645
| 名称 | 参数类型 | 可读 | 可写 | 说明               |
| ---- | -------- | ---- | ---- | ------------------ |
| data | T        | 是   | 否   | 线程间传递的数据。 |
Z
zengyawen 已提交
646 647


Z
zengyawen 已提交
648
## WorkerGlobalScope
Z
zengyawen 已提交
649

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

Z
zengyawen 已提交
652
### 属性
Z
zengyawen 已提交
653

654
**系统能力:** SystemCapability.Utils.Lang
Z
zengyawen 已提交
655 656 657 658 659

| 名称 | 参数类型                                                     | 可读 | 可写 | 说明                                    |
| ---- | ------------------------------------------------------------ | ---- | ---- | --------------------------------------- |
| name | string                                                       | 是   | 否   | Worker的名字,有new&nbsp;Worker时指定。 |
| self | [WorkerGlobalScope](#workerglobalscope)&nbsp;&amp;&nbsp;typeof&nbsp;globalThis | 是   | 否   | WorkerGlobalScope本身。                 |
Z
zengyawen 已提交
660 661 662 663 664 665


### onerror

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

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

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

Z
zengyawen 已提交
670 671
**参数:**

Z
zengyawen 已提交
672 673 674
| 参数名 | 类型                      | 必填 | 说明       |
| ------ | ------------------------- | ---- | ---------- |
| ev     | [ErrorEvent](#errorevent) | 否   | 异常数据。 |
Z
zengyawen 已提交
675 676

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

Y
yqhan 已提交
678
```js
Z
zengyawen 已提交
679 680 681 682
// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js")
```
Y
yqhan 已提交
683
```js
Z
zengyawen 已提交
684 685 686 687 688 689
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort
parentPort.onerror = function(e){
    console.log("worker.js onerror")
}
Y
yqhan 已提交
690 691
```

W
wangzhaoyong 已提交
692 693 694 695
## 其他说明

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

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

### 注意事项
- Worker存在数量限制,当前支持最多同时存在7个Worker。
- 当Worker数量超出限制,会出现Error "Too many workers, the number of workers exceeds the maximum."。
- 主动销毁Worker可以调用新创建Worker对象的terminate()或parentPort.close()方法。
- Worker的创建和销毁耗费性能,建议管理已创建的Worker并重复使用。

Y
yqhan 已提交
705 706 707 708 709
## 完整示例
### FA模型
```js
// main.js(同级目录为例)
import worker from '@ohos.worker';
W
wangzhaoyong 已提交
710
// 主线程中创建Worker对象
Y
yqhan 已提交
711 712 713 714
const workerInstance = new worker.Worker("workers/worker.ts");
// 创建js和ts文件都可以
// const workerInstance = new worker.Worker("workers/worker.js");

W
wangzhaoyong 已提交
715
// 主线程向worker线程传递信息
Y
yqhan 已提交
716
workerInstance.postMessage("123");
W
wangzhaoyong 已提交
717 718

// 主线程接收worker线程信息
Y
yqhan 已提交
719
workerInstance.onmessage = function(e) {
W
wangzhaoyong 已提交
720
    // data:worker线程发送的信息
Y
yqhan 已提交
721 722
    let data = e.data;
    console.log("main.js onmessage");
W
wangzhaoyong 已提交
723 724

    // 销毁Worker对象
Y
yqhan 已提交
725 726
    workerInstance.terminate();
}
W
wangzhaoyong 已提交
727 728

// 在调用terminate后,执行回调onexit
Y
yqhan 已提交
729 730 731 732 733 734 735
workerInstance.onexit = function() {
    console.log("main.js terminate");
}
```
```js
// worker.js
import worker from '@ohos.worker';
W
wangzhaoyong 已提交
736 737

// 创建worker线程中与主线程通信的对象
Y
yqhan 已提交
738 739
const parentPort = worker.parentPort

W
wangzhaoyong 已提交
740
// worker线程接收主线程信息
Y
yqhan 已提交
741
parentPort.onmessage = function(e) {
W
wangzhaoyong 已提交
742
    // data:主线程发送的信息
Y
yqhan 已提交
743 744
    let data = e.data;
    console.log("worker.js onmessage");
W
wangzhaoyong 已提交
745 746

    // worker线程向主线程发送信息
Y
yqhan 已提交
747 748 749
    parentPort.postMessage("123")
}

W
wangzhaoyong 已提交
750
// worker线程发生error的回调
Y
yqhan 已提交
751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768
parentPort.onerror= function(e) {
    console.log("worker.js onerror");
}
```
build-profile.json5 配置 :
```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/MainAbility/workers/worker.ts"
      ]
    }
  }
```
### Stage模型
```js
// main.js(以不同目录为例)
import worker from '@ohos.worker';
W
wangzhaoyong 已提交
769 770

// 主线程中创建Worker对象
Y
yqhan 已提交
771 772 773
const workerInstance = new worker.Worker("entry/ets/pages/workers/worker.ts");
// 创建js和ts文件都可以
// const workerInstance = new worker.Worker("entry/ets/pages/workers/worker.js");
W
wangzhaoyong 已提交
774 775

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

// 主线程接收worker线程信息
Y
yqhan 已提交
779
workerInstance.onmessage = function(e) {
W
wangzhaoyong 已提交
780
    // data:worker线程发送的信息
Y
yqhan 已提交
781 782
    let data = e.data;
    console.log("main.js onmessage");
W
wangzhaoyong 已提交
783 784

    // 销毁Worker对象
Y
yqhan 已提交
785 786 787 788 789 790 791 792 793 794
    workerInstance.terminate();
}
// 在调用terminate后,执行onexit
workerInstance.onexit = function() {
    console.log("main.js terminate");
}
```
```js
// worker.js
import worker from '@ohos.worker';
W
wangzhaoyong 已提交
795 796

// 创建worker线程中与主线程通信的对象
Y
yqhan 已提交
797 798
const parentPort = worker.parentPort

W
wangzhaoyong 已提交
799
// worker线程接收主线程信息
Y
yqhan 已提交
800
parentPort.onmessage = function(e) {
W
wangzhaoyong 已提交
801
    // data:主线程发送的信息
Y
yqhan 已提交
802 803
    let data = e.data;
    console.log("worker.js onmessage");
W
wangzhaoyong 已提交
804 805

    // worker线程向主线程发送信息
Y
yqhan 已提交
806 807 808
    parentPort.postMessage("123")
}

W
wangzhaoyong 已提交
809
// worker线程发生error的回调
Y
yqhan 已提交
810 811 812 813 814 815 816 817 818 819 820 821 822
parentPort.onerror= function(e) {
    console.log("worker.js onerror");
}
```
build-profile.json5 配置:
```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/pages/workers/worker.ts"
      ]
    }
  }
W
wangzhaoyong 已提交
823
```