• Node.js之EventEmiter


    参考:

    1. Node.js之EventEmiter讲解

    2. Node.js之events事件

    3. 在线运行node.js代码

    Node.js主要API使用异步事件驱动模型,异步I/O操作完成时,或者某些类型对象(触发器)会周期性地,触发一个命名事件到事件队列,用来调用函数对象(监听器)。

    比如net.Server对象在每次有新连接时触发一个事件,fs.readStream对象在文件打开时触发一个事件。

    所有这些能产生事件的对象都是events.EventEmitter的实例。

    所有这些对象开放接口:

    1. 注册事件名&监听器

    on()注册一个事件(名)和一个监听器,添加到监听器数组末尾,addListener()是on()的别名。emit(), 按顺序执行每个监听器。

    eventEmitter.on()  // 绑定事件名&监听器

    demo source code:

    var events = require('events');
    var eventEmitter = new events.EventEmitter;
    eventEmitter.on('start', function() {
        console.log('eventEmitter starts');
    });
    eventEmitter.emit('start');

    运行结果(打印):

    eventEmitter starts

    2. 给监听器listener传入参数与this

     emit方法允许给监听器传入任意参数,并且标准this会被设置为监听器所附加的EventEmitter。

    demo:

    var events = require('events');
    var eventEmitter = new events.EventEmitter;
    eventEmitter.on('start', function(a,b) {
        console.log('eventEmitter starts');
        console.log(a,b,this);
    });
    eventEmitter.emit('start','a','b');

    运行结果(打印):

    eventEmitter starts
    a b { domain: null,
      _events: { start: [Function] },
      _maxListeners: 10 }

    3. 最多只触发一次的监听器

    on注册的监听器可以触发多次,once注册的最多触发一次。

    demo

    var events = require('events');
    var eventEmitter = new events.EventEmitter;
    //用on注册事件,绑定监听器
    eventEmitter.on('start', function() {
        console.log('eventEmitter starts');
    });
    eventEmitter.emit('start');
    eventEmitter.emit('start');
    
    //用once注册事件,绑定监听器
    eventEmitter.once('do', function() {
        console.log('eventEmitter do');
    });
    eventEmitter.emit('do');
    eventEmitter.emit('do');

    运行结果输出:

    eventEmitter starts
    eventEmitter starts
    eventEmitter do

    4. 错误事件

    EventEmitter实例发生错误时,会触发名为‘error’的特殊事件。

    为防止node.js程序崩溃,建议始终为'error'事件注册监听器。

    var events = require('events');
    var eventEmitter = new events.EventEmitter;
    //用on注册事件,绑定监听器
    eventEmitter.on('error', function(err) {
        console.log('eventEmitter err occurs');
    });
    eventEmitter.emit('error', new Error('programme exception'));

    运行输出结果:

    eventEmitter err occurs

    5. 添加监听器/移除监听器事件

    当新增监听器时,所有EventEmitter会触发'newListener'事件;当移除监听器时,会触发'removeListener'事件。

    demo

    var events = require('events');
    var eventEmitter = new events.EventEmitter;
    //用once注册事件,只会执行一次
    eventEmitter.once('newListener', function(event, listener) {
        if(event=='start') {
            eventEmitter.on('start',function(){
                console.log('start 2');
            });
            console.log('start');
        }
    });
    eventEmitter.on('start',function(){
        console.log('eventEmitter start');
    });
    
    eventEmitter.emit('start');

    运行输出:

    start
    start 2
    eventEmitter start

    可以看到,触发‘start’事件,会同时触发'newListener'事件,并且on注册事件不会等待,而是直接执行后面的语句。

    newListener&removeListener事件触发源
    事件名 触发源 备注
    newListener

    addListener() on()别名
    on()  
    once() 只执行一次便自行注销
    removeListener removeListener()  
    removeAllListeners()  
    off()

    removeListener()别名,v10.0.0添加

    6. 最大监听器数量

    获取最大监听器数量getMaxListeners(),v1.0.0 API才有用,老版本nodejs可能会有编译错误。超出最大数量限制时,可以调用setMaxListeners()重新设置更大值。

  • 相关阅读:
    静态代理模式
    当对象或属性为空时,如何安全的给默认值
    linux抓取日志
    BigDecimal进行比较
    int与Double类型转换
    通过配置文件的key得值
    ObjectNode ArrayNode JsonNode
    java.lang.NoSuchFieldError报错解决方案
    BigDecimal.setScale 处理java小数点
    Jmeter实现压力测试(多并发测试)
  • 原文地址:https://www.cnblogs.com/fortunely/p/9433969.html
Copyright © 2020-2023  润新知