当前位置: 首页 > news >正文

鸿蒙NEXT开发Emitter工具类(ArkTs)

import { emitter } from '@kit.BasicServicesKit';

/**
 * TODO Emitter工具类(进行线程间通信)
 * author: 鸿蒙布道师
 * since: 2025/04/11
 */
export class EmitterUtil {
  /**
   * 发送事件
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   * @param eventData 发送的数据
   * @param priority 事件被发送的优先级,默认为 HIGH。
   */
  static post<T>(
    eventId: string | number,
    eventData: T,
    priority: emitter.EventPriority = emitter.EventPriority.HIGH
  ) {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    const options: emitter.Options = { priority };
    emitter.emit(eventId.toString(), options, { data: eventData });
  }

  /**
   * 订阅事件
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   * @param callback 接收到该事件时需要执行的回调处理函数。
   */
  static on<T>(eventId: string | number, callback: Callback<T>) {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    emitter.on(eventId.toString(), (eventData: emitter.GenericEventData<T>) => {
      if (eventData.data) {
        callback(eventData.data); // 确保 data 不为 undefined
      } else {
        console.warn('Received undefined data for event:', eventId);
      }
    });
  }

  /**
   * 单次订阅指定事件
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   * @param callback 接收到该事件时需要执行的回调处理函数。
   */
  static once<T>(eventId: string | number, callback: Callback<T>) {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    emitter.once(eventId.toString(), (eventData: emitter.GenericEventData<T>) => {
      if (eventData.data) {
        callback(eventData.data); // 确保 data 不为 undefined
      } else {
        console.warn('Received undefined data for event:', eventId);
      }
    });
  }

  /**
   * 取消事件订阅
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   */
  static unsubscribe(eventId: string | number) {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    emitter.off(eventId.toString());
  }

  /**
   * 获取指定事件的订阅数
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   * @returns 订阅数
   */
  static getListenerCount(eventId: string | number): number {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    return emitter.getListenerCount(eventId.toString());
  }

  /**
   * 取消指定事件的特定回调
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   * @param callback 要取消的回调函数。
   */
  static off<T>(eventId: string | number, callback: Callback<emitter.GenericEventData<T>>) {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    emitter.off(eventId.toString(), callback);
  }
}

// 定义通用回调类型
type Callback<T> = (data: T) => void;

代码如下:
import { emitter } from '@kit.BasicServicesKit';

/**
 * TODO Emitter工具类(进行线程间通信)
 * author: 鸿蒙布道师
 * since: 2025/04/11
 */
export class EmitterUtil {
  /**
   * 发送事件
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   * @param eventData 发送的数据
   * @param priority 事件被发送的优先级,默认为 HIGH。
   */
  static post<T>(
    eventId: string | number,
    eventData: T,
    priority: emitter.EventPriority = emitter.EventPriority.HIGH
  ) {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    const options: emitter.Options = { priority };
    emitter.emit(eventId.toString(), options, { data: eventData });
  }

  /**
   * 订阅事件
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   * @param callback 接收到该事件时需要执行的回调处理函数。
   */
  static on<T>(eventId: string | number, callback: Callback<T>) {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    emitter.on(eventId.toString(), (eventData: emitter.GenericEventData<T>) => {
      if (eventData.data) {
        callback(eventData.data); // 确保 data 不为 undefined
      } else {
        console.warn('Received undefined data for event:', eventId);
      }
    });
  }

  /**
   * 单次订阅指定事件
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   * @param callback 接收到该事件时需要执行的回调处理函数。
   */
  static once<T>(eventId: string | number, callback: Callback<T>) {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    emitter.once(eventId.toString(), (eventData: emitter.GenericEventData<T>) => {
      if (eventData.data) {
        callback(eventData.data); // 确保 data 不为 undefined
      } else {
        console.warn('Received undefined data for event:', eventId);
      }
    });
  }

  /**
   * 取消事件订阅
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   */
  static unsubscribe(eventId: string | number) {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    emitter.off(eventId.toString());
  }

  /**
   * 获取指定事件的订阅数
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   * @returns 订阅数
   */
  static getListenerCount(eventId: string | number): number {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    return emitter.getListenerCount(eventId.toString());
  }

  /**
   * 取消指定事件的特定回调
   * @param eventId 事件ID,string类型的eventId不支持空字符串。
   * @param callback 要取消的回调函数。
   */
  static off<T>(eventId: string | number, callback: Callback<emitter.GenericEventData<T>>) {
    if (!eventId || (typeof eventId === 'string' && !eventId.trim())) {
      throw new Error('Event ID cannot be empty or null.');
    }
    emitter.off(eventId.toString(), callback);
  }
}

// 定义通用回调类型
type Callback<T> = (data: T) => void;

                

相关文章:

  • 操作系统学习笔记——[特殊字符]超详细 | 如何唤醒被阻塞的 socket 线程?线程阻塞原理、线程池、fork/vfork彻底讲明白!
  • 【PCIE736-0】基于 PCIE X16 总线架构的 4 路 QSFP28 100G 光纤通道处理平台
  • DDoS攻防实战指南——解析企业级防护五大解决方案
  • leetcode03 -- 武汉旅游查询系统
  • 关于setTimeout输出
  • 面试篇 - Transformer模型中的位置编码
  • Windows 操作系统 - Windows 10 磁盘管理无法为 C 盘选择扩展卷
  • Java单例模式:实现全局唯一对象的艺术
  • Linux Kernel 3
  • LDAP渗透测试
  • java 线程池:IO密集型的任务(CPU核数 * 2 + 1),为什么这么设置,计算密集型任务( CPU核数+1 ),为什么这么设置
  • 火车头采集动态加载Ajax数据(无分页瀑布流网站)
  • Python numpy 与pandas
  • Apache Commons CLI 入门教程:轻松解析命令行参数
  • 运维面试题(十三)
  • linux一次启动多个jar包
  • 一键解锁Landsat 9地表温度计算!ENVI与ArcGIS Pro全流程详解(无需NASA大气校正)
  • 解决前端使用Axios时的跨域问题
  • 《MySQL从入门到精通》
  • 【数据集】上市公司投资效率及非效率投资数据测算+dofile(2000-2023年)
  • 【社论】个人破产探索,要守住“诚实而不幸”的底线
  • 山西省委常委李金科添新职
  • 城市轨道交通安全、内河港区布局规划、扎实做好防汛工作……今天的上海市政府常务会议研究了这些重要事项
  • 中国一直忽视欧盟经贸问题关切?外交部:事实证明中欧相互成就,共同发展
  • 港股持续拉升:恒生科技指数盘中涨幅扩大至6%,恒生指数涨3.3%
  • 第1现场 | 印巴停火次日:当地民众逐渐恢复正常生活