当前位置 主页 > 网站技术 > 代码类 > 最大化 缩小

    node.JS事件机制与events事件模块的使用方法详解

    栏目:代码类 时间:2020-02-06 15:08

    node.JS事件机制说明

    多数 Node.js 核心 API 都是采用惯用的异步事件驱动架构,其中某些类型的对象(称为触发器)会周期性地触发命名事件来调用函数对象(监听器)。例如,一个net.Server对象会在每次有新连接时触发一个事件;一个 fs.ReadStream 会在文件被打开时触发一个事件;一个 stream会在数据可读时触发事件。

    EventEmitter

    EventEmitter 类由 events 模块定义和开放的,所有能触发事件的对象都是 EventEmitter 类的实例

    var EventEmitter = require('events');
    /*
    { [Function: EventEmitter]
     EventEmitter: [Circular],
     usingDomains: false,
     defaultMaxListeners: [Getter/Setter],
     init: [Function],
     listenerCount: [Function] }
     */
    console.log(EventEmitter);

    events模块的EventEmitter属性指向该模块本身

    var events = require('events');
    console.log(events.EventEmitter === events);//true
    EventEmitter是一个构造函数,可以用来生成事件发生器的实例emitter
    var EventEmitter = require('events');
    var emitter = new EventEmitter();
    /*
    EventEmitter {
     domain: null,
     _events: {},
     _eventsCount: 0,
     _maxListeners: undefined }
     */
    console.log(emitter);

    方法

    emitter.emit(eventName[, ...args])

    eventName <any>

    ...args <any>

    该方法按监听器的注册顺序,同步地调用每个注册到名为eventName事件的监听器,并传入提供的参数。如果事件有监听器,则返回true,否则返回false

    var EventEmitter = require('events');
    var emitter = new EventEmitter();
    emitter.on('test1',function(){});
    console.log(emitter.emit('test1'));//true
    console.log(emitter.emit('test2'));//false

    emitter.on(eventName, listener)

    该方法用于添加listener函数到名为eventName的事件的监听器数组的末尾

    eventName <any> 事件名

    listener <Function> 回调函数

    [注意]不会检查listener是否已被添加。多次调用并传入相同的eventName和listener会导致listener被添加与调用多次

    var EventEmitter = require('events');
    var emitter = new EventEmitter();
    emitter.on('test',function(){
      console.log(1);
    });
    emitter.on('test',function(){
      console.log(2);
    });
    emitter.emit('test');//1 2

    该方法返回一个 EventEmitter 引用,可以链式调用

    var EventEmitter = require('events');
    var emitter = new EventEmitter();
    emitter.on('test',function(){
      console.log(1);
    }).on('test',function(){
      console.log(2);
    });
    emitter.emit('test');//1 2

    emitter.addListener(eventName, listener)

    emitter.on(eventName, listener) 的别名

    var EventEmitter = require('events');
    var emitter = new EventEmitter();
    emitter.addListener('test',function(){
      console.log(1);
    });
    emitter.emit('test');//1

    emitter.prependListener()

    与on()方法不同,prependListener()方法可用于将事件监听器添加到监听器数组的开头

    var EventEmitter = require('events');
    var emitter = new EventEmitter();
    emitter.on('test',function(){
      console.log(1);
    }).prependListener('test',function(){
      console.log(2);
    });
    emitter.emit('test');//2 1

    emitter.once(eventName, listener)