学习过程中,用这个的时候出现了一些问题,所以发出来共享,以免各位看官也遇到过相同问题,算是一个总结,也有一些注意事项,如果各位看官还有其他的想看的注意事项也可以发出来,我也可以去研究研究。

一、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)中回调函数接收。

看不懂我写的?没关系,下面的官方文档地址:
http://developer.huawei.com/consumer/cn/doc/harmonyos-references-V14/js-apis-emitter-V14#eventpriorityhttp://developer.huawei.com/consumer/cn/doc/harmonyos-references-V14/js-apis-emitter-V14#eventpriority

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作为传递的数据的用法请见官网:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V14/js-apis-emitter-V14#emitteremit12-1https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V14/js-apis-emitter-V14#emitteremit12-1

4.注意事项

  • emitter.on(ce)必须在emitter.emit前就持续监听了,不能emitter.emit发送后跳转到新页面接收该消息,如果是这样,就会遇到代码正确,但是无法接收该事件(emitter无法接收事件)。
  • 后续待补充...(暂时没遇到,如果你们遇到了也可以发给我,大家一起看) 
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐