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

3
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**<br/>
Z
zengyawen 已提交
4
> 本模块首批接口从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
| 名称   | 参数类型  | 可读 | 可写 | 说明                   |
| ------ | --------- | ---- | ---- | ---------------------- |
| name   | string    | 是   | 是   | Worker的名称。         |
Z
zengyawen 已提交
33 34 35 36


## Worker

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


### constructor

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

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

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

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

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

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

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

**示例:**

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

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

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

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

(1) 目录同级( **不添加也可以** )
W
wangzhaoyong 已提交
84

Y
yqhan 已提交
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
FA模型:

```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/MainAbility/workers/worker.ts"
      ]
    }
  }
```
Stage模型:
```json
  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/workers/worker.ts"
      ]
    }
  }
```
(2) 目录不同级( **必须添加** )
W
wangzhaoyong 已提交
107

Y
yqhan 已提交
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
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 已提交
127
```
Z
zengyawen 已提交
128 129 130
### postMessage

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

W
wangzhaoyong 已提交
132
向Worker线程发送数据,数据类型必须是序列化所支持的类型。序列化支持类型见其他说明。
Z
zengyawen 已提交
133 134

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

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

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

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

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

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

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


### on

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

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

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

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

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

**示例:**

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


### once

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

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

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

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

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

**示例:**

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


### off

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

W
wangzhaoyong 已提交
209
删除类型为type的事件监听。
Z
zengyawen 已提交
210 211

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

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

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

**示例:**

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


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

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

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

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

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

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


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

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

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

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

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

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

**示例:**

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


### onerror

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

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

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

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

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

**示例:**

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


### onmessage

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

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

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

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

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

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

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


### onmessageerror

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

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

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

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

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

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

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


## EventTarget


### addEventListener

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

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

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

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

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

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

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


### removeEventListener

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

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

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

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

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

**示例:**

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


### dispatchEvent

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

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

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

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

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

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

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

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

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


### removeAllListener

removeAllListener(): void
Z
zengyawen 已提交
424

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

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

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

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


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

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


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

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

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

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

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

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

**示例:**

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


### close

close(): void
Z
zengyawen 已提交
483

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

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

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

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


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

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

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

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

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

Z
zengyawen 已提交
515 516
| 参数名 | 类型                          | 必填 | 说明                   |
| ------ | ----------------------------- | ---- | ---------------------- |
W
wangzhaoyong 已提交
517
| event  | [MessageEvent](#messageevent) | 否   | 收到宿主线程发送的数据。 |
Z
zengyawen 已提交
518 519 520

**示例:**

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


### onmessageerror

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

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

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

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

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

**示例:**

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


## PostMessageOptions
Z
zengyawen 已提交
569 570 571

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

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

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


## Event
Z
zengyawen 已提交
580 581 582

事件类。

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

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


## EventListener
Z
zengyawen 已提交
592

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

595
事件监听类。
Z
zengyawen 已提交
596

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

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

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

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

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

**示例:**

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


## ErrorEvent

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

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

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


## MessageEvent
Z
zengyawen 已提交
637

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

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

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


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

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

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

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

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


### onerror

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

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

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

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

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

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

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

W
wangzhaoyong 已提交
691 692
## 其他说明

W
wangzhaoyong 已提交
693 694 695 696 697 698 699 700 701 702 703 704 705 706
### 序列化支持类型
| Type                | 备注                                                      | 是否支持             |
| ------------------- | -------------------------------------------------------- | -------------------- |
| All Primitive Type  | 不包括symbol                                              | 是                   |
| Date                |                                                          | 是                   |
| String              |                                                          | 是                   |
| RegExp              |                                                          | 是                   |
| Array               |                                                          | 是                   |
| Map                 |                                                          | 是                   |
| Set                 |                                                          | 是                   |
| Object              | 只支持Create from literal的简单Object,不支持带function的  | 是                   |
| ArrayBuffer         | 提供transfer能力                                          | 是                   |
| TypedArray          |                                                          | 是                   |

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

W
wangzhaoyong 已提交
710 711 712 713 714 715 716 717
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 已提交
718 719 720 721 722
## 完整示例
### FA模型
```js
// main.js(同级目录为例)
import worker from '@ohos.worker';
W
wangzhaoyong 已提交
723
// 主线程中创建Worker对象
Y
yqhan 已提交
724 725 726 727
const workerInstance = new worker.Worker("workers/worker.ts");
// 创建js和ts文件都可以
// const workerInstance = new worker.Worker("workers/worker.js");

W
wangzhaoyong 已提交
728
// 主线程向worker线程传递信息
Y
yqhan 已提交
729
workerInstance.postMessage("123");
W
wangzhaoyong 已提交
730 731

// 主线程接收worker线程信息
Y
yqhan 已提交
732
workerInstance.onmessage = function(e) {
W
wangzhaoyong 已提交
733
    // data:worker线程发送的信息
Y
yqhan 已提交
734 735
    let data = e.data;
    console.log("main.js onmessage");
W
wangzhaoyong 已提交
736 737

    // 销毁Worker对象
Y
yqhan 已提交
738 739
    workerInstance.terminate();
}
W
wangzhaoyong 已提交
740 741

// 在调用terminate后,执行回调onexit
Y
yqhan 已提交
742 743 744 745 746 747 748
workerInstance.onexit = function() {
    console.log("main.js terminate");
}
```
```js
// worker.js
import worker from '@ohos.worker';
W
wangzhaoyong 已提交
749 750

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

W
wangzhaoyong 已提交
753
// worker线程接收主线程信息
Y
yqhan 已提交
754
parentPort.onmessage = function(e) {
W
wangzhaoyong 已提交
755
    // data:主线程发送的信息
Y
yqhan 已提交
756 757
    let data = e.data;
    console.log("worker.js onmessage");
W
wangzhaoyong 已提交
758 759

    // worker线程向主线程发送信息
Y
yqhan 已提交
760 761 762
    parentPort.postMessage("123")
}

W
wangzhaoyong 已提交
763
// worker线程发生error的回调
Y
yqhan 已提交
764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781
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 已提交
782 783

// 主线程中创建Worker对象
Y
yqhan 已提交
784 785 786
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 已提交
787 788

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

// 主线程接收worker线程信息
Y
yqhan 已提交
792
workerInstance.onmessage = function(e) {
W
wangzhaoyong 已提交
793
    // data:worker线程发送的信息
Y
yqhan 已提交
794 795
    let data = e.data;
    console.log("main.js onmessage");
W
wangzhaoyong 已提交
796 797

    // 销毁Worker对象
Y
yqhan 已提交
798 799 800 801 802 803 804 805 806 807
    workerInstance.terminate();
}
// 在调用terminate后,执行onexit
workerInstance.onexit = function() {
    console.log("main.js terminate");
}
```
```js
// worker.js
import worker from '@ohos.worker';
W
wangzhaoyong 已提交
808 809

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

W
wangzhaoyong 已提交
812
// worker线程接收主线程信息
Y
yqhan 已提交
813
parentPort.onmessage = function(e) {
W
wangzhaoyong 已提交
814
    // data:主线程发送的信息
Y
yqhan 已提交
815 816
    let data = e.data;
    console.log("worker.js onmessage");
W
wangzhaoyong 已提交
817 818

    // worker线程向主线程发送信息
Y
yqhan 已提交
819 820 821
    parentPort.postMessage("123")
}

W
wangzhaoyong 已提交
822
// worker线程发生error的回调
Y
yqhan 已提交
823 824 825 826 827 828 829 830 831 832 833 834 835
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 已提交
836
```