手写node事件模块原理

  • node事件模块使用方法
let EventEmitter=require('events');
let {inherits}=require('util');
function Girl() {
    
}
inherits(Girl,EventEmitter);
let girl=new Girl();
girl.on('失恋',cry);
girl.emit('失恋');

function cry() {
    console.log('哭')
}
class EventEmitter{
    constructor(){
        this._events={};
    }
    on(eventName,callback){
        if(!this._events[eventName]){
            this._events[eventName]=[callback];
        }else {
            this._events[eventName].push(callback);
        }
    }
    once(eventName,callback){
        let fn=()=>{//绑定的是fn,执行的时候会触发fn函数
          callback();//fn函数中调用原有的callback
            this.removeListener(eventName,fn);//删除fn,再次执行时只会执行一次
        };
        this.on(eventName,fn);//1,先绑定,callback调用后再解绑,2要在callback中删除绑定

    }
    removeListener(eventName,callback){
        if(this._events[eventName]){
            this._events[eventName]=this._events[eventName].filter(cb=>cb!=callback);
        }
    }
    emit(eventName){
        if(this._events[eventName]){
            this._events[eventName].forEach(cb=>cb());
        }
    }
}
let ev=new EventEmitter();

let cry=()=>{console.log('cry')};
ev.once('失恋',cry);
ev.on('失恋',cry);
ev.removeListener('失恋',cry);
ev.emit('失恋');
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容