• nodejs events


    EventEmitter类

    events模块提供一个对象:events.EventEmitter,核心是事件触发和事件监听的封装。

    大多数时候不会直接使用EventEmitter,而是在对象中继承它(new一个出来)。

    方法:

    on:

    为指定事件注册一个监听器,接收一个字符串event和一个回调函数。

    emit:

    触发事件。返回值为布尔值。

    once:

    为指定事件注册一个单次监听器,最多只会触发一次,触发后立刻解除该监听器。

    addListener:

    为指定事件添加一个监听器到监听器数组的尾部。

    removeListener:

    移出指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。接收两个参数,一个是事件名称,第二个是回调函数名称。

    removeAllListeners:

    移除所有事件的监听器,如果指定事件,则移除指定事件的所有监听器。

    listeners:

    返回指定事件的监听器数组。

    示例:

    //test.js文件
    var EventEmitter = require('events').EventEmitter;
    var emitter = new EventEmitter();
    
    var listener1 = function listener1() {
        console.log('监听器1执行');
    };
    
    var listener2 = function listener2() {
        console.log('监听器2执行');
    };
    
    emitter.on('someEvent', listener1);
    
    emitter.on('someEvent', listener2);
    
    var eventListeners = EventEmitter.listenerCount(emitter, 'someEvent');
    
    console.log(eventListeners + '个监听器');   //2个监听器
    
    emitter.emit('someEvent');
    
    //移除第一个监听器listenter1
    emitter.removeListener('someEvent', listener1);
    
    var eventListeners = EventEmitter.listenerCount(emitter, 'someEvent');
    
    console.log(eventListeners + '个监听器');   //1个监听器
    
    console.log('程序执行完毕');

    执行:

    $ node test.js
    2个监听器
    监听器1执行
    监听器2执行
    1个监听器
    程序执行完毕

    setMaxListeners:

    默认情况下,EventEmitters超过10个监听器就会输出警告信息。setMaxListeners函数用于提高监听器的默认限制的数量。

    示例:

    //test.js文件
    var EventEmitter = require('events').EventEmitter;
    var emitter = new EventEmitter();
    
    emitter.on('someEvent', function () {
        console.log('监听器1执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器2执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器3执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器4执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器5执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器6执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器7执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器8执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器9执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器10执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器11执行');
    });
    
    
    emitter.emit('someEvent');

    命令行执行:

    $ node test.js
    监听器1执行
    监听器2执行
    监听器3执行
    监听器4执行
    监听器5执行
    监听器6执行
    监听器7执行
    监听器8执行
    监听器9执行
    监听器10执行
    监听器11执行
    (node:10112) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 someEvent listeners added. Use emitter.setMaxListeners() to increase limit

    当绑定的监听器超过10个时,虽然程序顺利执行,但是抛出了警告。如下所示,就不会发出警告了。要添加在监听器绑定的前面。

    //test.js文件
    var EventEmitter = require('events').EventEmitter;
    var emitter = new EventEmitter();
    
    emitter.setMaxListeners(11);    //提高监听器的默认限制数量
    
    emitter.on('someEvent', function () {
        console.log('监听器1执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器2执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器3执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器4执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器5执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器6执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器7执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器8执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器9执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器10执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器11执行');
    });
    
    emitter.emit('someEvent');

    监听事件的最大额度并不是为所有事件分配的,例如下面代码,不会发出监听器数量警告

    var EventEmitter = require('events').EventEmitter;
    var emitter = new EventEmitter();
    
    emitter.on('someEvent', function () {
        console.log('监听器1执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器2执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器3执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器4执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器5执行');
    });
    emitter.on('someEvent', function () {
        console.log('监听器6执行');
    });
    emitter.on('someEvent2', function () {
        console.log('监听器7执行');
    });
    emitter.on('someEvent2', function () {
        console.log('监听器8执行');
    });
    emitter.on('someEvent2', function () {
        console.log('监听器9执行');
    });
    emitter.on('someEvent2', function () {
        console.log('监听器10执行');
    });
    emitter.on('someEvent2', function () {
        console.log('监听器11执行');
    });
    
    emitter.emit('someEvent');
    emitter.emit('someEvent2');
  • 相关阅读:
    WPF 之 布局(一)
    CSS 之 内层div填充margin,外层div的背景色不会覆盖该margin
    T-SQL 之 多表联合更新
    jQuery
    Joomla, Wordpress, Drupal 全面详细Pk比较-转载
    js ==与===区别(两个等号与三个等号)
    Jquery DataTables 自定义布局sdom
    Jquery DataTable
    解决Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in
    firedebug调试Jquery
  • 原文地址:https://www.cnblogs.com/lianglanlan/p/8716409.html
Copyright © 2020-2023  润新知