js-apis-worker.md 14.3 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 7

## 导入模块
Z
zengyawen 已提交
8 9 10 11 12

```
import worker from '@ohos.worker';
```

Z
zengyawen 已提交
13 14 15 16 17 18 19 20 21

## 属性

| 名称 | 参数类型 | 可读 | 可写 | 说明 |
| -------- | -------- | -------- | -------- | -------- |
| parentPort | [DedicatedWorkerGlobalScope](#dedicatedworkerglobalscope) | 是 | 是 | worker线程用于与宿主线程通信的对象 |


## WorkerOptions
Z
zengyawen 已提交
22 23 24

worker构造函数函数的选项信息,用于为worker添加其他信息。

Z
zengyawen 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37 38
| 名称 | 参数类型 | 可读 | 可写 | 说明 |
| -------- | -------- | -------- | -------- | -------- |
| type | "classic" | 是 | 是 | 按照指定方式执行脚本。 |
| name | string | 是 | 是 | worker的名称。 |


## Worker

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


### constructor

constructor(scriptURL: string, options?: WorkerOptions)
Z
zengyawen 已提交
39 40 41

worker构造函数。

Z
zengyawen 已提交
42 43 44 45 46 47 48
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | scriptURL | string | 是 | worker执行脚本的url,路径规范:若DevEco新建工程在pages同级下没有workers目录,需要新建workers目录,将脚本文件放入workers目录。 |
  | options | [WorkerOptions](#workeroptions) | 否 | worker构造的选项。 |

- 返回值:
Z
zengyawen 已提交
49
  | 类型 | 说明 |
Z
zengyawen 已提交
50 51 52 53 54
  | -------- | -------- |
  | worker | 执行Worker构造函数生成的Worker对象,失败则返回undefined。 |

- 示例:
  ```
Z
zengyawen 已提交
55
  const workerInstance = new worker.Worker("workers/worker.js", {name:"first worker"});
Z
zengyawen 已提交
56 57 58 59 60 61
  ```


### postMessage

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

向worker线程发送消息,数据的传输采用结构化克隆算法。

Z
zengyawen 已提交
65 66 67 68 69 70 71 72
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | message | Object | 是 | 发送至worker的数据。 |
  | options | [PostMessageOptions](#postmessageoptions) | 否 | 可转移对象是 ArrayBuffer 的实例对象。transferList数组中不可传入null。 |

- 示例:
  ```
Z
zengyawen 已提交
73 74 75 76 77
  const workerInstance = new worker.Worker("workers/worker.js");
  workerInstance.postMessage("hello world");
  ```
  ```
  const workerInstance= new worker.Worker("workers/worker.js");
Z
zengyawen 已提交
78
  var buffer = new ArrayBuffer(8);
Z
zengyawen 已提交
79
  workerInstance.postMessage(buffer, [buffer]);
Z
zengyawen 已提交
80 81 82 83 84 85
  ```


### on

on(type: string, listener: EventListener): void
Z
zengyawen 已提交
86 87 88

向worker添加一个事件监听。

Z
zengyawen 已提交
89 90 91 92 93 94 95 96
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | type | string | 是 | 监听事件的type。 |
  | listener | [EventListener](#eventlistener) | 是 | 回调的事件。 |

- 示例:
  ```
Z
zengyawen 已提交
97 98
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.on("alert", (e)=>{
Z
zengyawen 已提交
99 100 101 102 103 104 105 106
      console.log("alert listener callback");
  })
  ```


### once

once(type: string, listener: EventListener): void
Z
zengyawen 已提交
107 108 109

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

Z
zengyawen 已提交
110 111 112 113 114 115 116 117
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | type | string | 是 | 监听事件的type。 |
  | listener | [EventListener](#eventlistener) | 是 | 回调的事件。 |

- 示例:
  ```
Z
zengyawen 已提交
118 119
  const workerInstance = new worker.Worker("workers/worker.js");
  workerInstance.once("alert", (e)=>{
Z
zengyawen 已提交
120 121 122 123 124 125 126 127
      console.log("alert listener callback");
  })
  ```


### off

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

删除worker的事件监听。

Z
zengyawen 已提交
131 132 133 134 135
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | type | string | 是 | 需要删除事件的type。 |
  | listener | [EventListener](#eventlistener) | 否 | 需要删除的回调的事件。 |
Z
zengyawen 已提交
136

Z
zengyawen 已提交
137 138
- 示例:
  ```
Z
zengyawen 已提交
139 140
  const workerInstance = new worker.Worker("workers/worker.js");
  workerInstance.off("alert");
Z
zengyawen 已提交
141
  ```
Z
zengyawen 已提交
142 143


Z
zengyawen 已提交
144
### terminate
Z
zengyawen 已提交
145

Z
zengyawen 已提交
146 147 148 149 150 151
terminate(): void

关闭worker线程,终止worker接收消息。

- 示例:
  ```
Z
zengyawen 已提交
152 153
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.terminate()
Z
zengyawen 已提交
154
  ```
Z
zengyawen 已提交
155 156


Z
zengyawen 已提交
157 158 159
### onexit

onexit?: (code: number) => void
Z
zengyawen 已提交
160 161 162

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

Z
zengyawen 已提交
163 164 165 166 167 168 169
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | code | number | 否 | worker退出的code。 |

- 示例:
  ```
Z
zengyawen 已提交
170 171
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.onexit = function(e) {
Z
zengyawen 已提交
172 173 174 175 176 177 178 179
      console.log("onexit")
  }
  ```


### onerror

onerror?: (err: ErrorEvent) => void
Z
zengyawen 已提交
180 181 182

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

Z
zengyawen 已提交
183 184 185 186 187 188 189
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | err | [ErrorEvent](#errorevent) | 否 | 异常数据。 |

- 示例:
  ```
Z
zengyawen 已提交
190 191
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.onerror = function(e) {
Z
zengyawen 已提交
192 193 194 195 196 197 198 199
      console.log("onerror")
  }
  ```


### onmessage

onmessage?: (event: MessageEvent) => void
Z
zengyawen 已提交
200 201 202

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

Z
zengyawen 已提交
203 204 205 206 207 208 209
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | event | [MessageEvent](#messageevent) | 否 | 收到的worker消息数据。 |

- 示例:
  ```
Z
zengyawen 已提交
210 211
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.onmessage = function(e) {
Z
zengyawen 已提交
212 213 214 215 216 217 218 219
      console.log("onerror")
  }
  ```


### onmessageerror

onmessageerror?: (event: MessageEvent) => void
Z
zengyawen 已提交
220 221 222

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

Z
zengyawen 已提交
223 224 225 226 227 228 229
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | event | [MessageEvent](#messageevent) | 否 | 异常数据。 |

- 示例:
  ```
Z
zengyawen 已提交
230 231
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.onmessageerror= function(e) {
Z
zengyawen 已提交
232 233 234 235 236 237 238 239 240 241 242
      console.log("onmessageerror")
  }
  ```


## EventTarget


### addEventListener

addEventListener(type: string, listener: EventListener): void
Z
zengyawen 已提交
243 244 245

向worker添加一个事件监听。

Z
zengyawen 已提交
246 247 248 249 250 251 252 253
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | type | string | 是 | 监听事件的type。 |
  | listener | [EventListener](#eventlistener) | 是 | 回调的事件。 |

- 示例:
  ```
Z
zengyawen 已提交
254 255
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.addEventListener("alert", (e)=>{
Z
zengyawen 已提交
256 257 258 259 260 261 262 263
      console.log("alert listener callback");
  })
  ```


### removeEventListener

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

删除worker的事件监听。

Z
zengyawen 已提交
267 268 269 270 271 272 273 274
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | type | string | 是 | 需要删除事件的type。 |
  | callback | [EventListener](#eventlistener) | 否 | 需要删除的回调的事件。 |

- 示例:
  ```
Z
zengyawen 已提交
275 276
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.removeEventListener("alert")
Z
zengyawen 已提交
277 278 279 280 281 282
  ```


### dispatchEvent

dispatchEvent(event: Event): boolean
Z
zengyawen 已提交
283 284 285

分发定义在worker的事件。

Z
zengyawen 已提交
286 287 288 289 290 291
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | event | [Event](#event) | 是 | 需要分发的事件。 |

- 返回值:
Z
zengyawen 已提交
292
  | 类型 | 说明 |
Z
zengyawen 已提交
293 294 295 296 297
  | -------- | -------- |
  | boolean | 分发的结果,false表示分发失败。 |

- 示例:
  ```
Z
zengyawen 已提交
298 299
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.dispatchEvent({type:"alert"})
Z
zengyawen 已提交
300 301 302 303 304 305
  ```


### removeAllListener

removeAllListener(): void
Z
zengyawen 已提交
306 307 308

删除worker的所有事件监听。

Z
zengyawen 已提交
309 310
- 示例:
  ```
Z
zengyawen 已提交
311 312
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.removeAllListener({type:"alert"})
Z
zengyawen 已提交
313
  ```
Z
zengyawen 已提交
314 315


Z
zengyawen 已提交
316
## DedicatedWorkerGlobalScope
Z
zengyawen 已提交
317

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


Z
zengyawen 已提交
321
### postMessage
Z
zengyawen 已提交
322

Z
zengyawen 已提交
323
postMessage(message: Object, options?: PostMessageOptions): void
Z
zengyawen 已提交
324 325 326

worker向宿主线程发送消息。

Z
zengyawen 已提交
327 328 329 330 331 332 333 334 335 336
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | message | Object | 是 | 发送至worker的数据。 |
  | options | [PostMessageOptions](#postmessageoptions) | 否 | 可转移对象是ArrayBuffer的实例对象。transferList数组中不可传入null。 |

- 示例:
  ```
  // main.js
  import worker from '@ohos.worker';
Z
zengyawen 已提交
337 338 339
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.postMessage("hello world")
  workerInstance.onmessage = function(e) {
Z
zengyawen 已提交
340 341
      console.log("receive data from worker.js")
  }
Z
zengyawen 已提交
342 343
  ```
  ```
Z
zengyawen 已提交
344
  // worker.js
Z
zengyawen 已提交
345
  import worker from '@ohos.worker';
Z
zengyawen 已提交
346 347 348 349 350 351 352 353 354 355
  const parentPort = worker.parentPort;
  parentPort.onmessage = function(e){
      parentPort.postMessage("receive data from main.js")
  }
  ```


### close

close(): void
Z
zengyawen 已提交
356 357 358

关闭worker线程,终止worker接收消息。

Z
zengyawen 已提交
359 360 361 362
- 示例:
  ```
  // main.js
  import worker from '@ohos.worker';
Z
zengyawen 已提交
363 364 365
  const workerInstance = new worker.Worker("workers/worker.js")
  ```
  ```
Z
zengyawen 已提交
366
  // worker.js
Z
zengyawen 已提交
367
  import worker from '@ohos.worker';
Z
zengyawen 已提交
368 369 370 371 372
  const parentPort = worker.parentPort;
  parentPort.onmessage = function(e) {
      parentPort.close()
  }
  ```
Z
zengyawen 已提交
373 374


Z
zengyawen 已提交
375
### onmessage
Z
zengyawen 已提交
376

Z
zengyawen 已提交
377
onmessage?: (event: MessageEvent) => void
Z
zengyawen 已提交
378 379 380

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

Z
zengyawen 已提交
381 382 383 384 385 386 387 388 389
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | event | [MessageEvent](#messageevent) | 否 | 收到的worker消息数据。 |

- 示例:
  ```
  // main.js
  import worker from '@ohos.worker';
Z
zengyawen 已提交
390 391 392 393
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.postMessage("hello world")
  ```
  ```
Z
zengyawen 已提交
394
  // worker.js
Z
zengyawen 已提交
395
  import worker from '@ohos.worker';
Z
zengyawen 已提交
396 397 398 399 400 401 402 403 404 405
  const parentPort = worker.parentPort;
  parentPort.onmessage = function(e) {
      console.log("receive main.js message")
  }
  ```


### onmessageerror

onmessageerror?: (event: MessageEvent) => void
Z
zengyawen 已提交
406 407 408

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

Z
zengyawen 已提交
409 410 411 412 413 414 415 416 417
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | event | [MessageEvent](#messageevent) | 否 | 异常数据。 |

- 示例:
  ```
  // main.js
  import worker from '@ohos.worker';
Z
zengyawen 已提交
418 419 420
  const workerInstance = new worker.Worker("workers/worker.js")
  ```
  ```
Z
zengyawen 已提交
421
  // worker.js
Z
zengyawen 已提交
422
  import worker from '@ohos.worker';
Z
zengyawen 已提交
423 424 425 426 427 428 429 430
  const parentPort = worker.parentPort;
  parentPort.onmessageerror= function(e) {
      console.log("worker.js onmessageerror")
  }
  ```


## PostMessageOptions
Z
zengyawen 已提交
431 432 433

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

Z
zengyawen 已提交
434 435 436 437 438 439
| 名称 | 参数类型 | 可读 | 可写 | 说明 |
| -------- | -------- | -------- | -------- | -------- |
| transfer | Object[] | 是 | 是 | ArrayBuffer数组,用于传递所有权。 |


## Event
Z
zengyawen 已提交
440 441 442

事件类。

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


## EventListener
Z
zengyawen 已提交
450 451 452

事件监听类。

Z
zengyawen 已提交
453 454

### (evt: Event): void | Promise<void>
Z
zengyawen 已提交
455 456 457

执行的回调函数。

Z
zengyawen 已提交
458 459 460 461 462 463
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | evt | [Event](#event) | 是 | 回调的事件类。 |

- 返回值
Z
zengyawen 已提交
464
  | 类型 | 说明 |
Z
zengyawen 已提交
465 466 467 468 469
  | -------- | -------- |
  | void \| Promise<void> | 无返回值或者以Promise形式返回。 |

- 示例:
  ```
Z
zengyawen 已提交
470 471
  const workerInstance = new worker.Worker("workers/worker.js");
  workerInstance.addEventListener("alert", (e)=>{
Z
zengyawen 已提交
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490
      console.log("alert listener callback");
  })
  ```


## ErrorEvent

错误事件类,用于表示worker执行过程中出现异常的详细信息,ErrorEvent类继承[Event](#event)

| 名称 | 参数类型 | 可读 | 可写 | 说明 |
| -------- | -------- | -------- | -------- | -------- |
| message | string | 是 | 否 | 异常发生的错误信息。 |
| filename | string | 是 | 否 | 出现异常所在的文件。 |
| lineno | number | 是 | 否 | 异常所在的行数。 |
| colno | number | 是 | 否 | 异常所在的列数。 |
| error | Object | 是 | 否 | 异常类型。 |


## MessageEvent
Z
zengyawen 已提交
491 492 493

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

Z
zengyawen 已提交
494 495 496 497 498 499 500 501
| 名称 | 参数类型 | 可读 | 可写 | 说明 |
| -------- | -------- | -------- | -------- | -------- |
| data | T | 是 | 否 | 线程间传递的数据。 |


## WorkerGlobalScope

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


Z
zengyawen 已提交
504
### 属性
Z
zengyawen 已提交
505

Z
zengyawen 已提交
506 507 508 509 510 511 512 513 514 515 516
| 名称 | 参数类型 | 可读 | 可写 | 说明 |
| -------- | -------- | -------- | -------- | -------- |
| name | string | 是 | 否 | worker的名字,有new Worker时指定。 |
| self | [WorkerGlobalScope](#workerglobalscope) & typeof globalThis | 是 | 否 | WorkerGlobalScope本身。 |


### onerror

onerror?: (ev: ErrorEvent) => void

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

Z
zengyawen 已提交
518 519 520 521 522 523 524 525 526
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | ev | [ErrorEvent](#errorevent) | 否 | 异常数据。 |

- 示例:
  ```
  // main.js
  import worker from '@ohos.worker';
Z
zengyawen 已提交
527 528 529
  const workerInstance = new worker.Worker("workers/worker.js")
  ```
  ```
Z
zengyawen 已提交
530
  // worker.js
Z
zengyawen 已提交
531
  import worker from '@ohos.worker';
Z
zengyawen 已提交
532 533 534 535 536
  const parentPort = worker.parentPort
  parentPort.onerror = function(e){
      console.log("worker.js onerror")
  }
  ```