# 使用Emitter进行线程间通信 Emitter是一ç§ä½œç”¨åœ¨è¿›ç¨‹å†…çš„äº‹ä»¶å¤„ç†æœºåˆ¶ï¼Œä¸ºåº”ç”¨ç¨‹åºæä¾›è®¢é˜…äº‹ä»¶ã€å‘布事件ã€å–消事件订阅的能力。 ## åœºæ™¯ä»‹ç» Emitter用于åŒä¸€è¿›ç¨‹å†…相åŒçº¿ç¨‹æˆ–ä¸åŒçº¿ç¨‹é—´çš„事件处ç†ï¼Œäº‹ä»¶å¼‚æ¥æ‰§è¡Œã€‚使用时需è¦å…ˆè®¢é˜…一个事件,然åŽå‘布该事件,å‘布完æˆåŽEmitter会将已å‘布的事件分å‘给订阅者,订阅者就会执行该事件订阅时设置的回调方法。当ä¸éœ€è¦è®¢é˜…è¯¥äº‹ä»¶æ—¶åº”åŠæ—¶å–消订阅释放Emitter资æºã€‚ ## è¿ä½œæœºåˆ¶ Emitter通过维护一个内部事件队列,æ¥è¿›è¡Œä»»åŠ¡åˆ†å‘。应用需è¦å…ˆè®¢é˜…æŸä¸ªäº‹ä»¶å¹¶è®¾ç½®å¥½è¯¥äº‹ä»¶çš„回调方法,当应用程åºå‘布事件åŽï¼Œå°±ä¼šå¾€é˜Ÿåˆ—é‡Œé¢æ’入一个事件。任务队列会串行执行队列里é¢çš„任务,执行任务时会调用该任务订阅者的回调方法进行事件处ç†ã€‚  ## 接å£è¯´æ˜Ž 详细请å‚è§[EmitteræŽ¥å£æ–‡æ¡£](../../reference/apis-basic-services-kit/js-apis-emitter.md)。 | 接å£å | 用途 | 说明 | | ------- | ------ | -------- | | on | 订阅事件 | æŒç»è®¢é˜…äº‹ä»¶ï¼Œç›´è‡³è¯¥äº‹ä»¶è¢«å–æ¶ˆè®¢é˜…。 | | once | 订阅事件 | 订阅事件一次。 | | emit | å‘布事件 | å‘布事件一次。 | | off | å–æ¶ˆäº‹ä»¶è®¢é˜… | å–æ¶ˆäº‹ä»¶è®¢é˜…åŽï¼Œå°†ä¸å†æŽ¥æ”¶è¯¥äº‹ä»¶çš„æ¶ˆæ¯ã€‚ | ## 开呿¥éª¤ 使用Emitter实现事件订阅ã€äº‹ä»¶å‘é€ä»¥åŠäº‹ä»¶åˆ é™¤ï¼Œå¼€å‘æ¥éª¤å¦‚下。 1. 导入模å—。 ```ts import { emitter } from '@kit.BasicServicesKit'; ``` 2. 订阅事件。 订阅事件使用on(æŒç»è®¢é˜…)或者onceï¼ˆå•æ¬¡è®¢é˜…)接å£è¿›è¡Œè®¢é˜…,设置è¦è®¢é˜…çš„äº‹ä»¶ä»¥åŠæŽ¥æ”¶åˆ°äº‹ä»¶åŽçš„回调函数。 ```ts // 定义一个eventId为1的事件。 let event: emitter.InnerEvent = { eventId: 1 }; // on订阅事件,收到eventId为1çš„äº‹ä»¶åŽæ‰§è¡Œå›žè°ƒå‡½æ•°ã€‚ emitter.on(event, () => { console.info('on callback'); }); ``` ```ts // 收到eventId为1çš„äº‹ä»¶åŽæ‰§è¡Œå›žè°ƒå‡½æ•°ã€‚ // 注æ„:onceè®¢é˜…åªæŽ¥æ”¶ä¸€æ¬¡äº‹ä»¶ï¼Œonè®¢é˜…åˆ™ä¸€ç›´æŽ¥æ”¶ç›´åˆ°å–æ¶ˆè®¢é˜…为æ¢ã€‚ emitter.once(event, () => { console.info('once callback'); }); ``` 3. å‘é€äº‹ä»¶ã€‚ å‘é€äº‹ä»¶ä½¿ç”¨emit接å£è¿›è¡Œå‘é€ï¼Œè®¾ç½®è¦å‘é€çš„事件以åŠè¦ä¼ é€’çš„å‚æ•°ã€‚ ```ts // 定义一个eventId为1的事件,事件优先级为Low。 let event: emitter.InnerEvent = { eventId: 1, priority: emitter.EventPriority.LOW }; //订阅该事件,并接收eventDataæ•°æ®ã€‚ emitter.once(event, (eventData : emitter.EventData) => { console.info('enter callback, eventData-content:' + eventData?.data?.content); console.info('enter callback, eventData-id:' + eventData?.data?.id); console.info('enter callback, eventData-isEmpty:' + eventData?.data?.isEmpty); }); let eventData: emitter.EventData = { data: { content: 'emitter', id: 1, isEmpty: false } }; // å‘é€eventId为1的事件,事件内容为eventData。 emitter.emit(event, eventData); ``` 4. å–æ¶ˆäº‹ä»¶è®¢é˜…。 > **说明:** > > 当ä¸éœ€è¦è®¢é˜…æŸä¸ªäº‹ä»¶æ—¶ï¼Œéœ€è¦åŠæ—¶å–消订阅é¿å…é€ æˆå†…å˜æ³„æ¼ã€‚ å–æ¶ˆäº‹ä»¶è®¢é˜…使用off接å£è¿›è¡Œå–消,设置è¦å–消的事件ID。 ```ts // å–æ¶ˆeventId为1的事件。 emitter.off(1); ```