zoukankan      html  css  js  c++  java
  • nodejs基础 -- EventEmitter

    var events = require('events');

    nodejs所有的异步I/O操作在完成时都会发送一个事件到事件队列

    nodejs里面的许多对象都会分发事件,如:

      一个net.Server对象会在每次有新连接时分发一个事件

      一个fs.readStream对象会在文件被打开的时候发出一个事件

    所有这些事件都是由EventsEmitter对象产生的

    EventEmitter类

    events模块只提供了一个对象:events.EventEmitter

    EventEmitter的核心工作就是:事件监听器事件触发 功能的封装

    用法:

    var EventEmitter = require('events').EventEmitter; 
    var event = new EventEmitter(); 
    event.on('some_event', function() { 
        console.log('some_event 事件触发'); 
    }); 
    setTimeout(function() { 
        event.emit('some_event'); 
    }, 1000); 

    运行这段代码,1 秒后控制台输出了 'some_event 事件触发'。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在 1000 毫秒以后向 event 对象发送事件 some_event,此时会调用some_event 的监听器。

    EventEmitter的每个事件由一个事件名和若干个参数组成(事件参数作为回调函数参数传递);

    对于每个事件,EventEmitter支持若干个事件监听器(事件触发时,注册到这个事件的事件监听器被依次调用)

    var events = require('events'); 
    var emitter = new events.EventEmitter(); 
    emitter.on('someEvent', function(arg1, arg2) { 
        console.log('listener1', arg1, arg2); 
    }); 
    emitter.on('someEvent', function(arg1, arg2) { 
        console.log('listener2', arg1, arg2); 
    }); 
    emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

    结果:

    listener1 arg1 参数 arg2 参数
    listener2 arg1 参数 arg2 参数

    以上例子中,emitter 为事件 someEvent 注册了两个事件监听器,然后触发了 someEvent 事件。

    运行结果中可以看到两个事件监听器回调函数被先后调用

    EventEmitter 属性、方法介绍

    EventEmitter对象方法

    EventEmitter类方法

    listenerCount(emitter, event):返回指定事件的监听器数量。

    EventEmitter事件

    实例:

    var events = require('events');
    var eventEmitter = new events.EventEmitter();
    
    // 监听器 #1
    var listner1 = function listner1() {
       console.log('监听器 listner1 执行。');
    }
    
    // 监听器 #2
    var listner2 = function listner2() {
      console.log('监听器 listner2 执行。');
    }
    
    // 绑定 connection 事件,处理函数为 listner1 
    eventEmitter.addListener('connection', listner1);
    
    // 绑定 connection 事件,处理函数为 listner2
    eventEmitter.on('connection', listner2);
    
    var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
    console.log(eventListeners + " 监听器监听连接事件。");
    
    // 处理 connection 事件 
    eventEmitter.emit('connection');
    
    // 移除监绑定的 listner1 函数
    eventEmitter.removeListener('connection', listner1);
    console.log("listner1 不再受监听。");
    
    // 触发连接事件
    eventEmitter.emit('connection');
    
    eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
    console.log(eventListeners + " 监听器监听连接事件。");
    
    console.log("程序执行完毕。");

    error 事件

    EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到 异常的时候通常会触发 error 事件。

    当 error 被触发时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并输出错误信息。

    我们一般要为会触发 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃。例如:

    var events = require('events'); 
    var emitter = new events.EventEmitter(); 
    emitter.emit('error'); 
  • 相关阅读:
    UVA 408 (13.07.28)
    linux概念之用户,组及权限
    Java实现 蓝桥杯 历届试题 网络寻路
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 九宫重排
    Java实现 蓝桥杯 历届试题 九宫重排
  • 原文地址:https://www.cnblogs.com/hf8051/p/5053948.html
Copyright © 2011-2022 走看看