ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式-发布订阅模式(typescript版本)

2022-03-21 14:00:46  阅读:162  来源: 互联网

标签:订阅 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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有