鸿蒙中使用emitter注意事项
emitter提供了在同一进程不同线程间,或同一进程同一线程内,发送和处理事件的能力,包括持续订阅事件、单次订阅事件、取消订阅事件,以及发送事件到事件队列的能力。用处:持续订阅指定的事件,并在接收到该事件时,执行对应的回调处理函数。event: 订阅或发送的事件,订阅事件的时候EventPriority不生效,可以为InnerEvent类型(包含了eventId: number和priority:
·
学习过程中,用这个的时候出现了一些问题,所以发出来共享,以免各位看官也遇到过相同问题,算是一个总结,也有一些注意事项,如果各位看官还有其他的想看的注意事项也可以发出来,我也可以去研究研究。
一、emitter的基础使用
1.介绍
emitter提供了在同一进程不同线程间,或同一进程同一线程内,发送和处理事件的能力,包括持续订阅事件、单次订阅事件、取消订阅事件,以及发送事件到事件队列的能力。
2.接口介绍(官网上也有)
-
emitter.on(event: InnerEvent, callback: Callback<EventData>): void
- 用处:持续订阅指定的事件,并在接收到该事件时,执行对应的回调处理函数。
- event: 订阅或发送的事件,订阅事件的时候EventPriority不生效,可以为InnerEvent类型(包含了eventId: number和priority: EventPrioity(优先级)), 也可以为字符串类型,不超过10240字节。
-
EventPrioity说明 名称 值 说明 IMMEDIATE 0 表示事件被立即投递。 HIGH 1 表示事件先于LOW优先级投递。 LOW 2 表示事件优于IDLE优先级投递,事件的默认优先级是LOW。 IDLE 3 表示在没有其他事件的情况下,才投递该事件。 -
InnerEvent说明 名称 类型 只读 可选 说明 eventId number 否 否 事件ID,由开发者定义用来辨别事件。 priority EventPriority 否 是 事件被投递的优先级。 -
callback: 订阅相对应事件时,接收到该事件时触发,参数为在事件中携带的参数,参数可以为@Sendable修饰的类,其他接口也是如此。
-
emitter.once(event: InnerEvent, callback: Callback<EventData>): void
- 用处:与emitter.on相似,但是只订阅一次,接收到对应信息后自动取消订阅。
- event: 与emitter.on的event一样。
- callback: 与emiter.on的callback一样。
-
emitter.off(eventId: number, callback?: Callback<EventData>): void
- 用处:取消对于eventId事件的订阅。
- eventId:事件ID,订阅的事件ID相关数据。
- callback:可以有,也可以没有,如果有,也可以携带相关数据。
-
emitter.emit(event: InnerEvent, data?: EventData): void
- 用处:发送id为event的事件。
- event:可以为InnerEvent类型的数据或者为字符串。
- data:发送该事件时携带的参数,可以在emitter.on(ce)中回调函数接收。
3.示例代码
// 接收基础用法
emitter.on('action', (data) => {
...相关操作
})
// 接收复杂用法
let event: emitter.InnerEvent = {
eventId: 事件ID(自定义)
}
emitter.on(event, (data) => {
...相关操作
})
// 接收一次基础用法
emitter.once('action', (data) => {
...相关操作
})
// 接收一次复杂用法
let event: emitter.InnerEvent = {
eventId: 事件ID(自定义)
}
emitter.on(event, (data) => {
...相关操作
})
// 关闭订阅事件基础用法
emitter.off()
emitter.off(eventId)
// 关闭订阅事件复杂用法
emitter.off('action', () => {
...相关操作
})
emitter.off(eventId, () => {
...相关操作
})
// 发送基础用法
let eventData: emitter.EventData = {
data: {
...发送携带参数
}
}
emitter.emit('action', eventData)
// 发送复杂用法
let eventData: emitter.EventData = {
data: {
...发送携带参数
}
}
let innerEvent: emitter.InnerEvent = {
eventId: 事件ID,
priority: emitter.EventPriority.HIGH(事件优先级)
}
emitter.emit(innerEvent, eventData)
let eventData: emitter.EventData = {
data: {
...发送携带参数
}
}
let option: emitter.Options = {
priority: emitter.EventPriority.HIGH(事件优先级)
}
emitter.emit('action', option, eventData)
使用@Sendable作为传递的数据的用法请见官网:
4.注意事项
- emitter.on(ce)必须在emitter.emit前就持续监听了,不能emitter.emit发送后跳转到新页面接收该消息,如果是这样,就会遇到代码正确,但是无法接收该事件(emitter无法接收事件)。
- 后续待补充...(暂时没遇到,如果你们遇到了也可以发给我,大家一起看)
更多推荐



所有评论(0)