• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 启动一个Worker
2
3> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
4> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
5
6Worker是与主线程并行的独立线程。创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处理耗时操作但不可以直接操作UI。
7
8## 导入模块
9
10```
11import worker from '@ohos.worker';
12```
13
14
15## 属性
16
17**系统能力:** 以下各项对应的系统能力均为SystemCapability.Utils.Lang18
19| 名称       | 参数类型                                                  | 可读 | 可写 | 说明                                 |
20| ---------- | --------------------------------------------------------- | ---- | ---- | ------------------------------------ |
21| parentPort | [DedicatedWorkerGlobalScope](#dedicatedworkerglobalscope) | 是   | 是   | worker线程用于与宿主线程通信的对象。 |
22
23
24## WorkerOptions
25
26Worker构造函数的选项信息,用于为Worker添加其他信息。
27
28**系统能力:** 以下各项对应的系统能力均为SystemCapability.Utils.Lang29
30| 名称 | 参数类型  | 可读 | 可写 | 说明                   |
31| ---- | --------- | ---- | ---- | ---------------------- |
32| type | "classic" | 是   | 是   | 按照指定方式执行脚本。 |
33| name | string    | 是   | 是   | Worker的名称。         |
34
35
36## Worker
37
38使用以下方法前,均需先构造Worker实例,Worker类继承[EventTarget](#eventtarget)。
39
40
41### constructor
42
43constructor(scriptURL: string, options?: WorkerOptions)
44
45Worker构造函数。
46
47**系统能力:** SystemCapability.Utils.Lang
48
49**参数:**
50
51| 参数名    | 类型                            | 必填 | 说明                                                         |
52| --------- | ------------------------------- | ---- | ------------------------------------------------------------ |
53| scriptURL | string                          | 是   | Worker执行脚本的url,路径规范:若DevEco新建工程在pages同级下没有workers目录,需要新建workers目录,将脚本文件放入workers目录。 |
54| options   | [WorkerOptions](#workeroptions) | 否   | Worker构造的选项。                                           |
55
56**返回值:**
57
58| 类型   | 说明                                                      |
59| ------ | --------------------------------------------------------- |
60| Worker | 执行Worker构造函数生成的Worker对象,失败则返回undefined。 |
61
62**示例:**
63
64```
65const workerInstance = new worker.Worker("workers/worker.js", {name:"first worker"});
66```
67
68
69### postMessage
70
71postMessage(message: Object, options?: PostMessageOptions): void
72
73向Worker线程发送消息,数据的传输采用结构化克隆算法。
74
75**系统能力:** SystemCapability.Utils.Lang
76
77**参数:**
78
79| 参数名  | 类型                                      | 必填 | 说明                                                         |
80| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
81| message | Object                                    | 是   | 发送至Worker的数据。                                         |
82| options | [PostMessageOptions](#postmessageoptions) | 否   | 可转移对象是 ArrayBuffer 的实例对象。transferList数组中不可传入null。 |
83
84**示例:**
85
86```
87const workerInstance = new worker.Worker("workers/worker.js");
88workerInstance.postMessage("hello world");
89```
90
91```
92const workerInstance= new worker.Worker("workers/worker.js");
93var buffer = new ArrayBuffer(8);
94workerInstance.postMessage(buffer, [buffer]);
95```
96
97
98### on
99
100on(type: string, listener: EventListener): void
101
102向Worker添加一个事件监听。
103
104**系统能力:** SystemCapability.Utils.Lang
105
106**参数:**
107
108| 参数名   | 类型                            | 必填 | 说明             |
109| -------- | ------------------------------- | ---- | ---------------- |
110| type     | string                          | 是   | 监听事件的type。 |
111| listener | [EventListener](#eventlistener) | 是   | 回调的事件。     |
112
113**示例:**
114
115```
116const workerInstance = new worker.Worker("workers/worker.js")
117workerInstance.on("alert", (e)=>{
118    console.log("alert listener callback");
119})
120```
121
122
123### once
124
125once(type: string, listener: EventListener): void
126
127向Worker添加一个事件监听,事件监听只执行一次便自动删除。
128
129**系统能力:** SystemCapability.Utils.Lang
130
131**参数:**
132
133| 参数名   | 类型                            | 必填 | 说明             |
134| -------- | ------------------------------- | ---- | ---------------- |
135| type     | string                          | 是   | 监听事件的type。 |
136| listener | [EventListener](#eventlistener) | 是   | 回调的事件。     |
137
138**示例:**
139
140```
141const workerInstance = new worker.Worker("workers/worker.js");
142workerInstance.once("alert", (e)=>{
143    console.log("alert listener callback");
144})
145```
146
147
148### off
149
150off(type: string, listener?: EventListener): void
151
152删除Worker的事件监听。
153
154**系统能力:** SystemCapability.Utils.Lang
155
156**参数:**
157
158| 参数名   | 类型                            | 必填 | 说明                   |
159| -------- | ------------------------------- | ---- | ---------------------- |
160| type     | string                          | 是   | 需要删除事件的type。   |
161| listener | [EventListener](#eventlistener) | 否   | 需要删除的回调的事件。 |
162
163**示例:**
164
165```
166const workerInstance = new worker.Worker("workers/worker.js");
167workerInstance.off("alert");
168```
169
170
171### terminate
172
173terminate(): void
174
175关闭Worker线程,终止Worker接收消息。
176
177**系统能力:** SystemCapability.Utils.Lang
178
179**示例:**
180
181```
182const workerInstance = new worker.Worker("workers/worker.js")
183workerInstance.terminate()
184```
185
186
187### onexit
188
189onexit?: (code: number) => void
190
191Worker对象的onexit属性表示Worker退出时被调用的事件处理程序,处理程序在宿主线程中执行。
192
193**系统能力:** SystemCapability.Utils.Lang
194
195**参数:**
196
197| 参数名 | 类型   | 必填 | 说明               |
198| ------ | ------ | ---- | ------------------ |
199| code   | number | 否   | Worker退出的code。 |
200
201**示例:**
202
203```
204const workerInstance = new worker.Worker("workers/worker.js")
205workerInstance.onexit = function(e) {
206    console.log("onexit")
207}
208```
209
210
211### onerror
212
213onerror?: (err: ErrorEvent) => void
214
215Worker对象的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在宿主线程中执行。
216
217**系统能力:** SystemCapability.Utils.Lang
218
219**参数:**
220
221| 参数名 | 类型                      | 必填 | 说明       |
222| ------ | ------------------------- | ---- | ---------- |
223| err    | [ErrorEvent](#errorevent) | 否   | 异常数据。 |
224
225**示例:**
226
227```
228const workerInstance = new worker.Worker("workers/worker.js")
229workerInstance.onerror = function(e) {
230    console.log("onerror")
231}
232```
233
234
235### onmessage
236
237onmessage?: (event: MessageEvent) => void
238
239Worker对象的onmessage属性表示宿主线程接收到来自其创建的Worker通过parentPort.postMessage接口发送的消息时被调用的事件处理程序,处理程序在宿主线程中执行。
240
241**系统能力:** SystemCapability.Utils.Lang
242
243**参数:**
244
245| 参数名 | 类型                          | 必填 | 说明                   |
246| ------ | ----------------------------- | ---- | ---------------------- |
247| event  | [MessageEvent](#messageevent) | 否   | 收到的Worker消息数据。 |
248
249**示例:**
250
251```
252const workerInstance = new worker.Worker("workers/worker.js")
253workerInstance.onmessage = function(e) {
254    console.log("onerror")
255}
256```
257
258
259### onmessageerror
260
261onmessageerror?: (event: MessageEvent) => void
262
263Worker对象的onmessageerror属性表示当Worker对象接收到一条无法被序列化的消息时被调用的事件处理程序,处理程序在宿主线程中执行。
264
265**系统能力:** SystemCapability.Utils.Lang
266
267**参数:**
268
269| 参数名 | 类型                          | 必填 | 说明       |
270| ------ | ----------------------------- | ---- | ---------- |
271| event  | [MessageEvent](#messageevent) | 否   | 异常数据。 |
272
273**示例:**
274
275```
276const workerInstance = new worker.Worker("workers/worker.js")
277workerInstance.onmessageerror= function(e) {
278    console.log("onmessageerror")
279}
280```
281
282
283## EventTarget
284
285
286### addEventListener
287
288addEventListener(type: string, listener: EventListener): void
289
290向Worker添加一个事件监听。
291
292**系统能力:** SystemCapability.Utils.Lang
293
294**参数:**
295
296| 参数名   | 类型                            | 必填 | 说明             |
297| -------- | ------------------------------- | ---- | ---------------- |
298| type     | string                          | 是   | 监听事件的type。 |
299| listener | [EventListener](#eventlistener) | 是   | 回调的事件。     |
300
301**示例:**
302
303```
304const workerInstance = new worker.Worker("workers/worker.js")
305workerInstance.addEventListener("alert", (e)=>{
306    console.log("alert listener callback");
307})
308```
309
310
311### removeEventListener
312
313removeEventListener(type: string, callback?: EventListener): void
314
315删除Worker的事件监听。
316
317**系统能力:** SystemCapability.Utils.Lang
318
319**参数:**
320
321| 参数名   | 类型                            | 必填 | 说明                   |
322| -------- | ------------------------------- | ---- | ---------------------- |
323| type     | string                          | 是   | 需要删除事件的type。   |
324| callback | [EventListener](#eventlistener) | 否   | 需要删除的回调的事件。 |
325
326**示例:**
327
328```
329const workerInstance = new worker.Worker("workers/worker.js")
330workerInstance.removeEventListener("alert")
331```
332
333
334### dispatchEvent
335
336dispatchEvent(event: Event): boolean
337
338分发定义在Worker的事件。
339
340**系统能力:** SystemCapability.Utils.Lang
341
342**参数:**
343
344| 参数名 | 类型            | 必填 | 说明             |
345| ------ | --------------- | ---- | ---------------- |
346| event  | [Event](#event) | 是   | 需要分发的事件。 |
347
348**返回值:**
349
350| 类型    | 说明                            |
351| ------- | ------------------------------- |
352| boolean | 分发的结果,false表示分发失败。 |
353
354**示例:**
355
356```
357const workerInstance = new worker.Worker("workers/worker.js")
358workerInstance.dispatchEvent({type:"alert"})
359```
360
361
362### removeAllListener
363
364removeAllListener(): void
365
366删除Worker的所有事件监听。
367
368**系统能力:** SystemCapability.Utils.Lang
369
370**示例:**
371
372```
373const workerInstance = new worker.Worker("workers/worker.js")
374workerInstance.removeAllListener({type:"alert"})
375```
376
377
378## DedicatedWorkerGlobalScope
379
380Worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口关闭Worker线程,DedicatedWorkerGlobalScope类继承[WorkerGlobalScope](#workerglobalscope)。
381
382
383### postMessage
384
385postMessage(message: Object, options?: PostMessageOptions): void
386
387Worker向宿主线程发送消息。
388
389**系统能力:** SystemCapability.Utils.Lang
390
391**参数:**
392
393| 参数名  | 类型                                      | 必填 | 说明                                                         |
394| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
395| message | Object                                    | 是   | 发送至Worker的数据。                                         |
396| options | [PostMessageOptions](#postmessageoptions) | 否   | 可转移对象是ArrayBuffer的实例对象。transferList数组中不可传入null。 |
397
398**示例:**
399
400```
401// main.js
402import worker from '@ohos.worker';
403const workerInstance = new worker.Worker("workers/worker.js")
404workerInstance.postMessage("hello world")
405workerInstance.onmessage = function(e) {
406    console.log("receive data from worker.js")
407}
408```
409
410```
411// worker.js
412import worker from '@ohos.worker';
413const parentPort = worker.parentPort;
414parentPort.onmessage = function(e){
415    parentPort.postMessage("receive data from main.js")
416}
417```
418
419
420### close
421
422close(): void
423
424关闭Worker线程,终止Worker接收消息。
425
426**系统能力:** SystemCapability.Utils.Lang
427
428**示例:**
429
430```
431// main.js
432import worker from '@ohos.worker';
433const workerInstance = new worker.Worker("workers/worker.js")
434```
435
436```
437// worker.js
438import worker from '@ohos.worker';
439const parentPort = worker.parentPort;
440parentPort.onmessage = function(e) {
441    parentPort.close()
442}
443```
444
445
446### onmessage
447
448onmessage?: (event: MessageEvent) => void
449
450DedicatedWorkerGlobalScope的onmessage属性表示Worker线程收到来自其宿主线程通过worker.postMessage接口发送的消息时被调用的事件处理程序,处理程序在Worker线程中执行。
451
452**系统能力:** SystemCapability.Utils.Lang
453
454**参数:**
455
456| 参数名 | 类型                          | 必填 | 说明                   |
457| ------ | ----------------------------- | ---- | ---------------------- |
458| event  | [MessageEvent](#messageevent) | 否   | 收到的Worker消息数据。 |
459
460**示例:**
461
462```
463// main.js
464import worker from '@ohos.worker';
465const workerInstance = new worker.Worker("workers/worker.js")
466workerInstance.postMessage("hello world")
467```
468
469```
470// worker.js
471import worker from '@ohos.worker';
472const parentPort = worker.parentPort;
473parentPort.onmessage = function(e) {
474    console.log("receive main.js message")
475}
476```
477
478
479### onmessageerror
480
481onmessageerror?: (event: MessageEvent) => void
482
483DedicatedWorkerGlobalScope的onmessageerror属性表示当Worker对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在Worker线程中执行。
484
485**系统能力:** SystemCapability.Utils.Lang
486
487**参数:**
488
489| 参数名 | 类型                          | 必填 | 说明       |
490| ------ | ----------------------------- | ---- | ---------- |
491| event  | [MessageEvent](#messageevent) | 否   | 异常数据。 |
492
493**示例:**
494
495```
496// main.js
497import worker from '@ohos.worker';
498const workerInstance = new worker.Worker("workers/worker.js")
499```
500
501```
502// worker.js
503import worker from '@ohos.worker';
504const parentPort = worker.parentPort;
505parentPort.onmessageerror= function(e) {
506    console.log("worker.js onmessageerror")
507}
508```
509
510
511## PostMessageOptions
512
513明确数据传递过程中需要转移所有权对象的类,传递所有权的对象必须是ArrayBuffer。
514
515**系统能力:** 以下各项对应的系统能力均为SystemCapability.Utils.Lang516
517| 名称     | 参数类型 | 可读 | 可写 | 说明                              |
518| -------- | -------- | ---- | ---- | --------------------------------- |
519| transfer | Object[] | 是   | 是   | ArrayBuffer数组,用于传递所有权。 |
520
521
522## Event
523
524事件类。
525
526**系统能力:** 以下各项对应的系统能力均为SystemCapability.Utils.Lang527
528| 名称      | 参数类型 | 可读 | 可写 | 说明                               |
529| --------- | -------- | ---- | ---- | ---------------------------------- |
530| type      | string   | 是   | 否   | 指定事件的type。                   |
531| timeStamp | number   | 是   | 否   | 事件创建时的时间戳(精度为毫秒)。 |
532
533
534## EventListener
535
536事件监听类。
537
538
539### (evt: Event): void | Promise<void>
540
541执行的回调函数。
542
543**系统能力:** SystemCapability.Utils.Lang
544
545**参数:**
546
547| 参数名 | 类型            | 必填 | 说明           |
548| ------ | --------------- | ---- | -------------- |
549| evt    | [Event](#event) | 是   | 回调的事件类。 |
550
551**返回值:**
552
553| 类型                                  | 说明                            |
554| ------------------------------------- | ------------------------------- |
555| void \| Promise<void> | 无返回值或者以Promise形式返回。 |
556
557**示例:**
558
559```
560const workerInstance = new worker.Worker("workers/worker.js");
561workerInstance.addEventListener("alert", (e)=>{
562    console.log("alert listener callback");
563})
564```
565
566
567## ErrorEvent
568
569错误事件类,用于表示Worker执行过程中出现异常的详细信息,ErrorEvent类继承[Event](#event)。
570
571**系统能力:** 以下各项对应的系统能力均为SystemCapability.Utils.Lang572
573| 名称     | 参数类型 | 可读 | 可写 | 说明                 |
574| -------- | -------- | ---- | ---- | -------------------- |
575| message  | string   | 是   | 否   | 异常发生的错误信息。 |
576| filename | string   | 是   | 否   | 出现异常所在的文件。 |
577| lineno   | number   | 是   | 否   | 异常所在的行数。     |
578| colno    | number   | 是   | 否   | 异常所在的列数。     |
579| error    | Object   | 是   | 否   | 异常类型。           |
580
581
582## MessageEvent
583
584消息类,持有Worker线程间传递的数据。
585
586**系统能力:** 以下各项对应的系统能力均为SystemCapability.Utils.Lang587
588| 名称 | 参数类型 | 可读 | 可写 | 说明               |
589| ---- | -------- | ---- | ---- | ------------------ |
590| data | T        | 是   | 否   | 线程间传递的数据。 |
591
592
593## WorkerGlobalScope
594
595Worker线程自身的运行环境,WorkerGlobalScope类继承[EventTarget](#eventtarget)。
596
597### 属性
598
599**系统能力:** 以下各项对应的系统能力均为SystemCapability.Utils.Lang600
601| 名称 | 参数类型                                                     | 可读 | 可写 | 说明                                    |
602| ---- | ------------------------------------------------------------ | ---- | ---- | --------------------------------------- |
603| name | string                                                       | 是   | 否   | Worker的名字,有new Worker时指定。 |
604| self | [WorkerGlobalScope](#workerglobalscope) & typeof globalThis | 是   | 否   | WorkerGlobalScope本身。                 |
605
606
607### onerror
608
609onerror?: (ev: ErrorEvent) => void
610
611WorkerGlobalScope的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在Worker线程中执行。
612
613**系统能力:** SystemCapability.Utils.Lang
614
615**参数:**
616
617| 参数名 | 类型                      | 必填 | 说明       |
618| ------ | ------------------------- | ---- | ---------- |
619| ev     | [ErrorEvent](#errorevent) | 否   | 异常数据。 |
620
621**示例:**
622
623```
624// main.js
625import worker from '@ohos.worker';
626const workerInstance = new worker.Worker("workers/worker.js")
627```
628
629```
630// worker.js
631import worker from '@ohos.worker';
632const parentPort = worker.parentPort
633parentPort.onerror = function(e){
634    console.log("worker.js onerror")
635}
636```