美文网首页程序员
Nodejs模块当中的事件(events)

Nodejs模块当中的事件(events)

作者: 张培跃 | 来源:发表于2018-08-03 17:10 被阅读12次

    因为在node当中的大部分功能模块都依赖了events,所以events模块是Nodejs当中非常重要的模块之一。events对外暴露的是一个class即EventEmitter。EventEmitter的作用有两个,分别是对事件的监听与发射。

    1、实现on和emit

    自定义一个方法,输出的内容为“我很帅”。通过event当中的on与emit来实现对事件的监听与发射。

    //引入events模块
    const EventEmitter = require("events");
    //myEmitter继承EventEmitter类
    class myEmitter extends EventEmitter{};
    //实例化对象
    var even=new myEmitter();
    //自定义一个函数
    function ev1(){
        console.log("我很帅!");
    }
    //通过实例化对象event的on方法,自定义一个start的监听事件
    even.on("start",ev1);
    //触发名字叫做start的自定义事件
    even.emit("start");
    
    给事件传值

    输出的结果为“我很帅!怎么办,怎么办?”

    //引入events模块
    const EventEmitter = require("events");
    //myEmitter继承EventEmitter类
    class myEmitter extends EventEmitter{};
    //实例化对象
    var even=new myEmitter();
    //自定义一个函数
    function ev1(str){
        console.log("我很帅!"+str);
    }
    //通过实例化对象event的on方法,自定义一个start的监听事件
    even.on("start",ev1);
    //触发名字叫做start的自定义事件
    even.emit("start","怎么办,怎么办?");
    
    emit可以触发多次

    以下代码,在上面代码的基础上多发射了一次。你会发现“我很帅”被输出二次!

    //引入events模块
    const EventEmitter = require("events");
    //myEmitter继承EventEmitter类
    class myEmitter extends EventEmitter{};
    //实例化对象
    var even=new myEmitter();
    //自定义一个函数
    function ev1(){
        console.log("我很帅!");
    }
    //通过实例化对象event的on方法,自定义一个start的监听事件
    even.on("start",ev1);
    //触发名字叫做start的自定义事件
    even.emit("start");
    even.emit("start");
    
    通过on定义名字相同的监听

    结果会输出"我很帅!我很苦恼!"。说明监听事件名字相同,调用一次,均会执行!

    //引入events模块
    const EventEmitter = require("events");
    //myEmitter继承EventEmitter类
    class myEmitter extends EventEmitter{};
    //实例化对象
    var even=new myEmitter();
    //自定义一个函数
    function ev1(){
        console.log("我很帅!");
    }
    function ev2(){
        console.log("我很苦恼!");
    }
    //通过实例化对象event的on方法,自定义一个start的监听事件
    even.on("start",ev1);
    even.on("start",ev2);
    //触发名字叫做start的自定义事件
    even.emit("start");
    
    2、once方法

    通过这个方法的名字,你可能已经猜到这个方法的作用了!没错它的作用就是当你多次触发emit时,只会执行一次。也就是当你执行一次事件后将会从对应关系中移除掉。
    以下代码虽然被多次emit,但只会输出一次"我很帅”

    //引入events模块
    const EventEmitter = require("events");
    //myEmitter继承EventEmitter类
    class myEmitter extends EventEmitter{};
    //实例化对象
    var even=new myEmitter();
    //自定义一个函数
    function ev1(){
        console.log("我很帅!");
    }
    //通过实例化对象event的on方法,自定义一个start的监听事件
    even.once("start",ev1);
    //触发名字叫做start的自定义事件
    even.emit("start");
    even.emit("start");
    
    3、removeListener

    通过该方法可以移除指定的监听事件。以下代码最后一次emit时无效!

    //引入events模块
    const EventEmitter = require("events");
    //myEmitter继承EventEmitter类
    class myEmitter extends EventEmitter{};
    //实例化对象
    var even=new myEmitter();
    //自定义一个函数
    function ev1(){
        console.log("我很帅!");
    }
    //通过实例化对象event的on方法,自定义一个start的监听事件
    even.on("start",ev1);
    //触发名字叫做start的自定义事件
    even.emit("start");
    //移除事件名字为start,方法为ev1的监听
    even.removeListener("start",ev1);
    even.emit("start");
    
    4、removeAllListeners

    移除所有的监听事件。执行后你会发现啥也没有输出!

    //引入events模块
    const EventEmitter = require("events");
    //myEmitter继承EventEmitter类
    class myEmitter extends EventEmitter{};
    //实例化对象
    var even=new myEmitter();
    //自定义一个函数
    function ev1(){
        console.log("我很帅!");
    }
    function ev2(){
        console.log("我还很有才!");
    }
    //通过实例化对象event的on方法,自定义一个start的监听事件
    even.on("start",ev1);
    even.on("start",ev2);
    //触发名字叫做start的自定义事件
    //移除所有事件名字为start的监听
    even.removeAllListeners("start");
    even.emit("start");
    
    5、eventNames

    eventNames方法可以罗列出已注册的所有监听器的事件,类型为数组

    //引入events模块
    const EventEmitter = require("events");
    //myEmitter继承EventEmitter类
    class myEmitter extends EventEmitter{};
    //实例化对象
    var even=new myEmitter();
    //自定义一个函数
    function ev1(){
        console.log("开始!");
    }
    function ev2(){
        console.log("结束!");
    }
    //通过实例化对象event的on方法,自定义一个start的监听事件
    even.on("start",ev1);
    even.on("over",ev2);
    console.log(even.eventNames());//[ 'start', 'over' ]
    

    相关文章

      网友评论

        本文标题:Nodejs模块当中的事件(events)

        本文链接:https://www.haomeiwen.com/subject/vvquvftx.html