美文网首页Node.jsWeb前端之路程序员
Nodejs学习笔记(二)--- 事件模块

Nodejs学习笔记(二)--- 事件模块

作者: 秋天de童话 | 来源:发表于2017-06-22 19:43 被阅读169次
    1、简介

    events是node.js 最重要的模块,events模块只提供了一个对象events.EventEmitter,EventEmitter 的核心是事件发射与事件监听器。
    Node.js中大部分的模块,都继承自Event模块。
    与DOM树上事件不同,不存在事件冒泡、逐层捕获等行为。
    EventEmitter 支持若干个事件监听器。当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。   
    http://www.infoq.com/cn/articles/tyq-nodejs-event

    访问:

    require('events');
    
    2、事件常用函数及使用
    emitter.on(event, listener)
    image.png
    /*
        调用events模块,获取events.EventEmitter对象
    */
    var EventEmitter = require('events').EventEmitter;   
    var ee = new EventEmitter();
    
    /*
        EventEmitter.on(event, listener) 为事件注册一个监听
        参数1:event  字符串,事件名
        参数2:回调函数
    */
    ee.on('some_events', function(cat, dog) {
        console.log("第1个监听事件,参数cat=" + cat + ",dog="+dog );
    });
    
    console.log('第一轮');
    ee.emit('some_events', 'Tom', 'Tian');
    
    console.log('第二轮');
    ee.emit('some_events', 'Tom', 'T');
    
    //EventEmitter.on(event, listener) 示例源码
    
    emitter.emit(event, [arg1], [arg2], [...])
    image.png
    /*
        调用events模块,获取events.EventEmitter对象
    */
    var EventEmitter = require('events').EventEmitter;   
    var ee = new EventEmitter();
    
    /*
        EventEmitter.on(event, listener) 为事件注册一个监听
        参数1:event  字符串,事件名
        参数2:回调函数
    */
    ee.on('some_events', function(cat, dog) {
        console.log("第1个监听事件,参数cat=" + cat + ",dog="+dog );
    });
    
    
    /*
        EventEmitter.emit(event, [arg1], [arg2], [...])   触发指定事件
        参数1:event  字符串,事件名
        参数2:可选参数,按顺序传入回调函数的参数
        返回值:该事件是否有监听
    */
    var isSuccess = ee.emit('some_events', 'Tom', 'Tian');
    
    ee.on('some_events', function(cat, dog) {
        console.log("第2个监听事件,参数cat=" + cat + ",dog="+dog );
    });
    
    
    ee.emit('some_events', 'zhong', 'wei');
    
    var isSuccess2 = ee.emit('other_events', 'Tom', 'Tian');
    
    console.log(isSuccess);
    console.log(isSuccess2);
    
    emitter.once(event, listener)

    emitter.once注册监听是一次性监听,当触发一次后,会移除该监听!


    image.png
    /*
        调用events模块,获取events.EventEmitter对象
    */
    var EventEmitter = require('events').EventEmitter;   
    var ee = new EventEmitter();
    
    /*
        EventEmitter.once(event, listener)  为事件注册一次性监听,触发一次后移除监听
        参数1:event  字符串,事件名
        参数2:回调函数
    */
    ee.once('some_events', function(cat, dog) {
        console.log("第1个监听事件,参数cat=" + cat + ",dog="+dog );
    });
    
    
    
    console.log('第一轮');
    ee.emit('some_events', 'Wilson', 'Zhong');
    
    console.log('第二轮');
    var isSuccess =  ee.emit('some_events', 'Wilson', 'Zhong');
    console.log(isSuccess);
    
    emitter.removeListener(event, listener)
    image.png

    给some_events添加了三个监听,又移除了第一个和第三个监听,最后再用emitter.emit触发some_events,输出结果不难发现,用emitter.removeListener移除的第一个和第三个监听都没有再起作用

    var EventEmitter = require('events').EventEmitter;   
    var ee = new EventEmitter();
    
    var listener = function(dog,cat)
    {
        console.log("第1个监听事件,参数dog=" + dog + ",cat="+cat );
    }
    
    var listener2= function(dog,cat)
    {
        console.log("第2个监听事件,参数dog=" + dog + ",cat="+cat );
    }
    
    var listener3= function(dog,cat)
    {
        console.log("第3个监听事件,参数dog=" + dog + ",cat="+cat );
    }
    
    ee.on('some_events', listener);
    
    ee.on('some_events', listener2);
    
    ee.on('some_events', listener3);
    /*
        EventEmitter.removeListener(event, listener)  移除指定事件的监听器
        注意:该监听器必须是注册过的
       
    */
    ee.removeListener('some_events', listener);
    
    ee.removeListener('some_events', listener3);
    
    ee.emit('some_events', 'Wilson', 'Zhong');
    
    emitter.removeAllListeners([event])

    emitter.removeAllListeners传用事件名作为参数时,为移除传入事件名的所有监听,而不会影响其它事件监听!

    emitter.removeAllListeners可以不传用事件名参数;直接执行
    removeAllListeners(); //移除所有监听!(比较暴力的方法一般要慎用~~)
    
    emitter.listeners(event)
    image.png
    var EventEmitter = require('events').EventEmitter;   
    var ee = new EventEmitter();
    
    var listener = function(dog,cat)
    {
        console.log("第1个监听事件,参数dog=" + dog + ",cat="+cat );
    }
    
    var listener2= function(dog,cat)
    {
        console.log("第2个监听事件,参数dog=" + dog + ",cat="+cat );
    }
    
    ee.on('some_events', listener);
    
    ee.on('some_events', listener2);
    
    ee.on('other_events',function(dog,cat)
    {
        console.log("其它监听事件,参数dog=" + dog + ",cat="+cat );
    });
    
    /*
        EventEmitter.listeners(event)   //返回指定事件的监听数组
        参数1:event  字符串,事件名    
    */
    var listenerEventsArr = ee.listeners('some_events');
    
    console.log(listenerEventsArr.length)
    
    for (var i = listenerEventsArr.length - 1; i >= 0; i--) {
        console.log(listenerEventsArr[i]); 
    };
    
    
    emitter.setMaxListeners(n)
    image.png image.png
    var EventEmitter = require('events').EventEmitter;   
    var ee = new EventEmitter();
    
    /*
        EventEmitter.setMaxListeners (n)   给EventEmitter设置最大监听
        参数1: n 数字类型,最大监听数
        
        超过10个监听时,不设置EventEmitter的最大监听数会提示:
        (node) warning: possible EventEmitter memory leak detected. 11 listeners added.
         Use emitter.setMaxListeners() to increase limit.
        设计者认为侦听器太多,可能导致内存泄漏,所以存在这样一个警告
    */
    ee.setMaxListeners(15);
    
    /*
         给EventEmitter 添加11个监听
    */
    for (var i = 10; i >= 0; i--) {
        ee.on('some_events',function()
        {
            console.log('第'+ (i +1) +'个监听');
        });
    
    };
    
    EventEmitter.defaultMaxListeners
    

    EventEmitter.defaultMaxListeners功能与setMaxListeners类似,
    给所有EventEmitter设置最大监听
    setMaxListeners优先级大于defaultMaxListeners

    EventEmitter.listenerCount(emitter, event)
    

    返回指定事件的监听数

    特殊的事件Error

    引用自Node.js开发指南:EventEmitter 定义了一个特殊的事件 error,它包含了“错误”的语义,我们在遇到 异常的时候通常会发射 error 事件。当 error 被发射时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并打印调用栈。我们一般要为会发射 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃。

    其他的一些内容:https://nodejs.org/api/events.html

    相关文章

      网友评论

        本文标题:Nodejs学习笔记(二)--- 事件模块

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