zoukankan      html  css  js  c++  java
  • 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()重新设置更大值。

  • 相关阅读:
    ARM开发工具软件命令具体解释---嵌入式回归第三篇
    Java模拟公司置办货物系统(二)
    springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息
    Django Drops
    从 "org.apache.hadoop.security.AccessControlException:Permission denied: user=..." 看Hadoop 的用户登陆认证
    iOS中Storyboard使用要点记录
    ACdream 1084 寒假安排(阶乘素因子分解)
    【死磕Java并发】-----J.U.C之AQS:CLH同步队列
    使用freemarker做邮件发送模板
    springboot 使用freemarker自定义标签
  • 原文地址:https://www.cnblogs.com/fortunely/p/9433969.html
Copyright © 2011-2022 走看看