• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用Emitter进行线程间通信
2
3
4Emitter是一种作用在进程内的事件处理机制,为应用程序提供订阅事件、发布事件、取消事件订阅的能力。
5
6## 场景介绍
7
8Emitter用于同一进程内相同线程或不同线程间的事件处理,事件异步执行。使用时需要先订阅一个事件,然后发布该事件,发布完成后Emitter会将已发布的事件分发给订阅者,订阅者就会执行该事件订阅时设置的回调方法。当不需要订阅该事件时应及时取消订阅释放Emitter资源。
9
10## 运作机制
11Emitter通过维护一个内部事件队列,来进行任务分发。应用需要先订阅某个事件并设置好该事件的回调方法,当应用程序发布事件后,就会往队列里面插入一个事件。任务队列会串行执行队列里面的任务,执行任务时会调用该任务订阅者的回调方法进行事件处理。
12
13![emitter](figures/emitter.png)
14
15## 接口说明
16详细请参见[Emitter接口文档](../../reference/apis-basic-services-kit/js-apis-emitter.md)。
17| 接口名  | 用途   | 说明     |
18| ------- | ------ | -------- |
19| on | 订阅事件 | 持续订阅事件,直至该事件被取消订阅。 |
20| once | 订阅事件 | 订阅事件一次。 |
21| emit | 发布事件 | 发布事件一次。 |
22| off | 取消事件订阅 | 取消事件订阅后,将不再接收该事件的消息。 |
23
24## 开发步骤
25
26使用Emitter实现事件订阅、事件发送以及事件删除,开发步骤如下。
27
281. 导入模块。
29
30   ```ts
31   import { emitter, Callback } from '@kit.BasicServicesKit';
32   ```
33
342. 订阅事件。
35
36   订阅事件使用on(持续订阅)或者once(单次订阅)接口进行订阅,设置要订阅的事件以及接收到事件后的回调函数。
37   ```ts
38    // 定义一个eventId为1的事件。
39    let event: emitter.InnerEvent = {
40      eventId: 1
41    };
42    // 定义一个事件的回调处理函数,当收到对应的事件后执行回调函数
43    let callback: Callback<emitter.EventData> = (eventData: emitter.EventData) => {
44      console.info(`eventData: ${JSON.stringify(eventData)}`);
45    }
46
47    // 收到eventId为1的事件后执行回调函数
48    emitter.on(innerEvent, callback);
49   ```
50
51   ```ts
52    // 收到eventId为1的事件后执行回调函数。
53    // 注意:once订阅只接收一次事件,on订阅则一直接收直到取消订阅为止。
54    emitter.once(innerEvent, callback);
55   ```
56
573. 发送事件。
58
59   发送事件使用emit接口进行发送,设置要发送的事件以及要传递的参数。
60   ```ts
61   // 定义一个eventId为1的事件,事件优先级为Low。
62   let event: emitter.InnerEvent = {
63     eventId: 1,
64     priority: emitter.EventPriority.LOW
65   };
66
67   let callback: Callback<emitter.EventData> = (eventData: emitter.EventData) => {
68     console.info(`eventData: ${JSON.stringify(eventData)}`);
69   }
70   //订阅该事件,并接收eventData数据。
71   emitter.once(event, callback);
72
73   let eventData: emitter.EventData = {
74     data: {
75       content: 'emitter',
76       id: 1,
77       isEmpty: false
78     }
79   };
80
81   // 发送eventId为1的事件,事件内容为eventData。
82   emitter.emit(event, eventData);
83   ```
84
854. 取消事件订阅。
86    > **说明:**
87    >
88    > - 当不需要订阅某个事件时,需要及时取消订阅避免造成内存泄漏。
89    > - 使用[off](../../reference/apis-basic-services-kit/js-apis-emitter.md#emitteroff)接口取消某个事件订阅后,已通过[emit](../../reference/apis-basic-services-kit/js-apis-emitter.md#emitteremit)接口发布但尚未被执行的事件将被取消。
90   ```ts
91   // 取消eventId为1的事件。
92   emitter.off(1);
93   ```
94