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;