1# 使用Emitter进行线程间通信 2 3 4Emitter是一种作用在进程内的事件处理机制,为应用程序提供订阅事件、发布事件、取消事件订阅的能力。 5 6## 场景介绍 7 8Emitter用于同一进程内相同线程或不同线程间的事件处理,事件异步执行。使用时需要先订阅一个事件,然后发布该事件,发布完成后Emitter会将已发布的事件分发给订阅者,订阅者就会执行该事件订阅时设置的回调方法。当不需要订阅该事件时应及时取消订阅释放Emitter资源。 9 10## 运作机制 11Emitter通过维护一个内部事件队列,来进行任务分发。应用需要先订阅某个事件并设置好该事件的回调方法,当应用程序发布事件后,就会往队列里面插入一个事件。任务队列会串行执行队列里面的任务,执行任务时会调用该任务订阅者的回调方法进行事件处理。 12 13 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 } from '@kit.BasicServicesKit'; 32 import { hilog } from '@kit.PerformanceAnalysisKit'; 33 34 const TAG: string = 'ProcessModel'; 35 const DOMAIN_NUMBER: number = 0xFF00; 36 ``` 37 382. 订阅事件。 39 40 订阅事件使用on(持续订阅)或者once(单次订阅)接口进行订阅,设置要订阅的事件以及接收到事件后的回调函数。 41 ```ts 42 // 定义一个eventId为1的事件。 43 let event: emitter.InnerEvent = { 44 eventId: 1 45 }; 46 47 // on订阅事件,收到eventId为1的事件后执行回调函数。 48 emitter.on(event, () => { 49 hilog.info(DOMAIN_NUMBER, TAG, 'on callback'); 50 }); 51 ``` 52 53 ```ts 54 // 收到eventId为1的事件后执行回调函数。 55 // 注意:once订阅只接收一次事件,on订阅则一直接收直到取消订阅为止。 56 emitter.once(event, () => { 57 hilog.info(DOMAIN_NUMBER, TAG, 'once callback'); 58 }); 59 ``` 60 613. 发送事件。 62 63 发送事件使用emit接口进行发送,设置要发送的事件以及要传递的参数。 64 ```ts 65 // 定义一个eventId为1的事件,事件优先级为Low。 66 let event: emitter.InnerEvent = { 67 eventId: 1, 68 priority: emitter.EventPriority.LOW 69 }; 70 71 //订阅该事件,并接收eventData数据。 72 emitter.once(event, (eventData : emitter.EventData) => { 73 hilog.info(DOMAIN_NUMBER, TAG, 'enter callback, eventData-content:' + eventData?.data?.content); 74 hilog.info(DOMAIN_NUMBER, TAG, 'enter callback, eventData-id:' + eventData?.data?.id); 75 hilog.info(DOMAIN_NUMBER, TAG, 'enter callback, eventData-isEmpty:' + eventData?.data?.isEmpty); 76 }); 77 78 let eventData: emitter.EventData = { 79 data: { 80 content: 'emitter', 81 id: 1, 82 isEmpty: false 83 } 84 }; 85 86 // 发送eventId为1的事件,事件内容为eventData。 87 emitter.emit(event, eventData); 88 ``` 89 904. 取消事件订阅。 91 > **说明:** 92 > 93 > 当不需要订阅某个事件时,需要及时取消订阅避免造成内存泄漏。 94 95 取消事件订阅使用off接口进行取消,设置要取消的事件ID。 96 ```ts 97 // 取消eventId为1的事件。 98 emitter.off(1); 99 ``` 100