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

## 权限
Z
zengyawen 已提交
15 16 17



Z
zengyawen 已提交
18 19 20 21 22 23 24 25 26

## 属性

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


## WorkerOptions
Z
zengyawen 已提交
27 28 29

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

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


## Worker

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


### constructor

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

worker构造函数。

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

- 返回值:
  | 参数名 | 说明 |
  | -------- | -------- |
  | worker | 执行Worker构造函数生成的Worker对象,失败则返回undefined。 |

- 示例:
  ```
Z
zengyawen 已提交
60
  const workerInstance = new worker.Worker("workers/worker.js", {name:"first worker"});
Z
zengyawen 已提交
61 62 63 64 65 66
  ```


### postMessage

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

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

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

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


### on

on(type: string, listener: EventListener): void
Z
zengyawen 已提交
91 92 93

向worker添加一个事件监听。

Z
zengyawen 已提交
94 95 96 97 98 99 100 101
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | type | string | 是 | 监听事件的type。 |
  | listener | [EventListener](#eventlistener) | 是 | 回调的事件。 |

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


### once

once(type: string, listener: EventListener): void
Z
zengyawen 已提交
112 113 114

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

Z
zengyawen 已提交
115 116 117 118 119 120 121 122
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | type | string | 是 | 监听事件的type。 |
  | listener | [EventListener](#eventlistener) | 是 | 回调的事件。 |

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


### off

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

删除worker的事件监听。

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

Z
zengyawen 已提交
142 143
- 示例:
  ```
Z
zengyawen 已提交
144 145
  const workerInstance = new worker.Worker("workers/worker.js");
  workerInstance.off("alert");
Z
zengyawen 已提交
146
  ```
Z
zengyawen 已提交
147 148


Z
zengyawen 已提交
149
### terminate
Z
zengyawen 已提交
150

Z
zengyawen 已提交
151 152 153 154 155 156
terminate(): void

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

- 示例:
  ```
Z
zengyawen 已提交
157 158
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.terminate()
Z
zengyawen 已提交
159
  ```
Z
zengyawen 已提交
160 161


Z
zengyawen 已提交
162 163 164
### onexit

onexit?: (code: number) => void
Z
zengyawen 已提交
165 166 167

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

Z
zengyawen 已提交
168 169 170 171 172 173 174
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | code | number | 否 | worker退出的code。 |

- 示例:
  ```
Z
zengyawen 已提交
175 176
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.onexit = function(e) {
Z
zengyawen 已提交
177 178 179 180 181 182 183 184
      console.log("onexit")
  }
  ```


### onerror

onerror?: (err: ErrorEvent) => void
Z
zengyawen 已提交
185 186 187

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

Z
zengyawen 已提交
188 189 190 191 192 193 194
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | err | [ErrorEvent](#errorevent) | 否 | 异常数据。 |

- 示例:
  ```
Z
zengyawen 已提交
195 196
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.onerror = function(e) {
Z
zengyawen 已提交
197 198 199 200 201 202 203 204
      console.log("onerror")
  }
  ```


### onmessage

onmessage?: (event: MessageEvent) => void
Z
zengyawen 已提交
205 206 207

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

Z
zengyawen 已提交
208 209 210 211 212 213 214
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | event | [MessageEvent](#messageevent) | 否 | 收到的worker消息数据。 |

- 示例:
  ```
Z
zengyawen 已提交
215 216
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.onmessage = function(e) {
Z
zengyawen 已提交
217 218 219 220 221 222 223 224
      console.log("onerror")
  }
  ```


### onmessageerror

onmessageerror?: (event: MessageEvent) => void
Z
zengyawen 已提交
225 226 227

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

Z
zengyawen 已提交
228 229 230 231 232 233 234
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | event | [MessageEvent](#messageevent) | 否 | 异常数据。 |

- 示例:
  ```
Z
zengyawen 已提交
235 236
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.onmessageerror= function(e) {
Z
zengyawen 已提交
237 238 239 240 241 242 243 244 245 246 247
      console.log("onmessageerror")
  }
  ```


## EventTarget


### addEventListener

addEventListener(type: string, listener: EventListener): void
Z
zengyawen 已提交
248 249 250

向worker添加一个事件监听。

Z
zengyawen 已提交
251 252 253 254 255 256 257 258
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | type | string | 是 | 监听事件的type。 |
  | listener | [EventListener](#eventlistener) | 是 | 回调的事件。 |

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


### removeEventListener

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

删除worker的事件监听。

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

- 示例:
  ```
Z
zengyawen 已提交
280 281
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.removeEventListener("alert")
Z
zengyawen 已提交
282 283 284 285 286 287
  ```


### dispatchEvent

dispatchEvent(event: Event): boolean
Z
zengyawen 已提交
288 289 290

分发定义在worker的事件。

Z
zengyawen 已提交
291 292 293 294 295 296 297 298 299 300 301 302
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | event | [Event](#event) | 是 | 需要分发的事件。 |

- 返回值:
  | 参数名 | 说明 |
  | -------- | -------- |
  | boolean | 分发的结果,false表示分发失败。 |

- 示例:
  ```
Z
zengyawen 已提交
303 304
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.dispatchEvent({type:"alert"})
Z
zengyawen 已提交
305 306 307 308 309 310
  ```


### removeAllListener

removeAllListener(): void
Z
zengyawen 已提交
311 312 313

删除worker的所有事件监听。

Z
zengyawen 已提交
314 315
- 示例:
  ```
Z
zengyawen 已提交
316 317
  const workerInstance = new worker.Worker("workers/worker.js")
  workerInstance.removeAllListener({type:"alert"})
Z
zengyawen 已提交
318
  ```
Z
zengyawen 已提交
319 320


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

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


Z
zengyawen 已提交
326
### postMessage
Z
zengyawen 已提交
327

Z
zengyawen 已提交
328
postMessage(message: Object, options?: PostMessageOptions): void
Z
zengyawen 已提交
329 330 331

worker向宿主线程发送消息。

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

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


### close

close(): void
Z
zengyawen 已提交
361 362 363

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

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


Z
zengyawen 已提交
380
### onmessage
Z
zengyawen 已提交
381

Z
zengyawen 已提交
382
onmessage?: (event: MessageEvent) => void
Z
zengyawen 已提交
383 384 385

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

Z
zengyawen 已提交
386 387 388 389 390 391 392 393 394
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | event | [MessageEvent](#messageevent) | 否 | 收到的worker消息数据。 |

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


### onmessageerror

onmessageerror?: (event: MessageEvent) => void
Z
zengyawen 已提交
411 412 413

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

Z
zengyawen 已提交
414 415 416 417 418 419 420 421 422
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | event | [MessageEvent](#messageevent) | 否 | 异常数据。 |

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


## PostMessageOptions
Z
zengyawen 已提交
436 437 438

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

Z
zengyawen 已提交
439 440 441 442 443 444
| 名称 | 参数类型 | 可读 | 可写 | 说明 |
| -------- | -------- | -------- | -------- | -------- |
| transfer | Object[] | 是 | 是 | ArrayBuffer数组,用于传递所有权。 |


## Event
Z
zengyawen 已提交
445 446 447

事件类。

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


## EventListener
Z
zengyawen 已提交
455 456 457

事件监听类。

Z
zengyawen 已提交
458 459

### (evt: Event): void | Promise<void>
Z
zengyawen 已提交
460 461 462

执行的回调函数。

Z
zengyawen 已提交
463 464 465 466 467 468 469 470 471 472 473 474
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | evt | [Event](#event) | 是 | 回调的事件类。 |

- 返回值
  | 参数名 | 说明 |
  | -------- | -------- |
  | void \| Promise<void> | 无返回值或者以Promise形式返回。 |

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


## ErrorEvent

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

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


## MessageEvent
Z
zengyawen 已提交
496 497 498

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

Z
zengyawen 已提交
499 500 501 502 503 504 505 506
| 名称 | 参数类型 | 可读 | 可写 | 说明 |
| -------- | -------- | -------- | -------- | -------- |
| data | T | 是 | 否 | 线程间传递的数据。 |


## WorkerGlobalScope

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


Z
zengyawen 已提交
509
### 属性
Z
zengyawen 已提交
510

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


### onerror

onerror?: (ev: ErrorEvent) => void

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

Z
zengyawen 已提交
523 524 525 526 527 528 529 530 531
- 参数:
  | 参数名 | 类型 | 必填 | 说明 |
  | -------- | -------- | -------- | -------- |
  | ev | [ErrorEvent](#errorevent) | 否 | 异常数据。 |

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