标签:订阅 typescript args eventName callback eventMap context 设计模式 any
实际操作:
/**
* example:
* 订阅:
* ObserveEvent.on(EventName,this.userInfo,this);
* 发布:
* ObserveEvent.emit(EventName,{userName:"小明",age:18,sex:"man"});
* 取消订阅:
* ObserveEvent.on(EventName,this.userInfo);
*/
// call is faster than apply, optimize less than 3 argu
// http://blog.csdn.net/zhengyinhui100/article/details/7837127
function emitEvents(
events: EventCallback[],
args: any[],
context?: any
): void {
if(args.length === 0){
events.forEach(event=>{
event.callback.call(context || event.context);
})
}else if(args.length <=3){
events.forEach(event=>{
event.callback.call(context || event.context, ...args);
})
}else{
events.forEach(event=>{
event.callback.apply(context || event.context, args);
})
}
}
interface EventCallback {
context?: any;
callback: (...args: any[]) => any;
force?: boolean; //是否强制推送
}
export default class ObserveEvent {
private static _eventMap: Map<string, EventCallback[]> = new Map<
string,
EventCallback[]
>();
public static on(
eventName: string,
callback: (...args: any[]) => any,
context?: any,
force?: boolean
): Event {
if (!this._eventMap.has(eventName)) this._eventMap.set(eventName, []);
this._eventMap.get(eventName)?.push({
callback,
context,
force,
});
return this;
}
public static off( eventName: string,callback?: (...args: any[])=>void): Event {
if (!this._eventMap.has(eventName)) return this;
if(!callback){
delete this._eventMap[eventName];
return;
}
const events = this._eventMap.get(eventName);
const index = events.findIndex(event=> event.callback === callback );
if(events[index]){
events.splice(index,1);
}
if(0 === events.length)delete this._eventMap[eventName];
return this;
}
public static emit(eventName: string,...args:any): boolean {
if (!this._eventMap.has(eventName)) return false;
const events = this._eventMap.get(eventName);
emitEvents(events,args)
}
public static clear():void{
this._eventMap.clear();
}
}
export interface Event {
on( eventName: string,
callback: (...args: any[]) => any,
context?: any,
force?: boolean
): Event;
off(
eventName: string,
callback?: (...args: any[]) => any
): Event;
clear():void;
emit(eventName: string, data: any): boolean;
}
标签:订阅,typescript,args,eventName,callback,eventMap,context,设计模式,any 来源: https://blog.csdn.net/z1067832450_/article/details/123633939
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。