node.js 中events事件【重要】

夜深了,人静了,灵感来了,敲敲代码。 

1、用法


// 非阻塞I/O
const EventEmitter=require('events');   //可以直接引用的模块,不需要自己写,或者引包,或者引入模块,就是核心模块

// 核心就是发布订阅  on 订阅   emit 发布  off 取消订阅   绑定一次  once
const events=new EventEmitter;


const cry=function(name){
    console.log('哭',name);
}

events.on('女孩失恋了',cry);

events.on('女孩失恋了',function(name){
    console.log('笑',name);
});

// 只执行,执行完毕后就将该函数移除,下次不会在继续触发了。

events.once('女孩失恋了',function(name){
    console.log('逛街',name);
});


events.off('女孩失恋了',cry);

events.emit('女孩失恋了','boy');
events.emit('女孩失恋了','boy');
/* process.nextTick(()=>{
    // nextTick  可以解决异步调用问题,方式优于promise.then();
    events.emit('女孩失恋了','boy');
}) */


// 先订阅,再发布

// vue3  mitt


// 一般的继承:实例继承+原型继承+类属性继承 = es6 的extend

// 原型继承有3种方法

function Girl(){

}
/* Object.setPrototypeOf(Girl.prototype,EventEmitter.prototype);   //es6
Girl.prototype=Object.create(EventEmitter);   // es5 
Girl.prototype._proto_=EventEmitter.prototype;  // es */  // 多

// node.js 中提供的方法 原型继承
const util=require('util');
util.inherits(Girl,EventEmitter);


// splice 和filter 删除

2、实现原理


// node 内部实现的还是构造函数

function EventEmitter(){
    this._events={};
}

EventEmitter.prototype.on=function(eventName,callback){
    if(!this._events) this._events={};
    const callbacks=this._events[eventName] ||[];
    callbacks.push(callback);
    this._events[eventName]=callbacks;

    console.log(this._events);
}

EventEmitter.prototype.emit=function(eventName,...args){
    if(!this._events) this._events={};
    let callbacks=this._events[eventName];
    if(callbacks){
        callbacks.forEach(cb => {
            cb(...args);
        });
    }
}

EventEmitter.prototype.off=function(eventName,callback){
    if(!this._events) this._events={};
    if(this._events[eventName]){
        this._events[eventName]=this._events[eventName].filter(fn=>fn!=callback && fn.l !=callback)
    }
    
}

EventEmitter.prototype.once=function(eventName,callback){
    // 先绑定,执行完成后再删除
    const one=(...args)=>{
        callback(...args);

        // 执行完毕后
        // 删除事件

        this.off(eventName,one);
    }

    // 先绑定事件

    one.l=callback;   // 自定义属性  创建关联

    this.on(eventName,one);
}

module.exports=EventEmitter;


// 或  第一个为真,就不走后面了。

// on  emit once  off 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vues

刚好遇见你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值