zoukankan      html  css  js  c++  java
  • Node.js:EventEmitter

    概要本篇博客主要介绍EventEmitter  

      Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列。事件由EventEmitter对象提供。下面通过一个例子来说明EventEmitter的用法:

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

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

    1. 事件发射器

      events模块只提供了一个对象:events.EventEmitter。EventEmitter的核心就是事件发射与事件监听功能的封装。EventEmitter的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EvenEmitter支持若干个事件监听器。当事件发射时,注册到这个事件的监听器被依次调用,事件参数作为回调函数参数传递。

      让我们以下面的例子来解释这个过程:

    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','byvoid',1991);

    运行结果是:

      以上例子中,emitter为事件someEvent注册了两个事件监听器,然后发射了someEvent事件。运行结果中可以看到这两个事件监听器回调函数被先后调用。

      这就是EventEmitter最简单的用法。接下来我们介绍一下EventEmitter常用的API。

    ● EventEmitter.on(event,listener) 为指定事件注册一个监听器,接受一个字符串event和一个回调函数listener。

    EventEmitter.emit(event.[arg1],[arg2],[...])发射event事件,传递若干可选参数到事件监听器的参数表。

    EventEmitter.once(event,listener)为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。

    EventEmitter.removelistener(event,listener)移除指定事件的某个监听器,listener必须是该事件已经注册过的监听器。

    EventEmitter.removeAllListeners([event])移除所有事件的所有监听器,如果指定event,则移除指定事件的所有监听器。

    2.error事件

      EventEmitter定义了一个特殊的事件error,在遇到异常时通常会发射error事件,当error被发射时,如果没有响应的监听器,Node.js会把它当作异常,退出程序并打印调用栈。我们一般会为发射器error事件的对象设置监听器,避免遇到错误后整个程序崩溃。例如:

    var events = require('events');
    var emitter = new events.EventEmitter();
    
    emitter.emit('error');

    运行时,会显示以下错误:

    3.继承EventEmitter

      大多数时候我们不会直接使用EventEmitter,而是在对象中继承它。包括fs、net、http在内的,只要是支持事件响应的核心模块都是EventEmitter的子类。

  • 相关阅读:
    wp8使用mvvm模式简单例子(二)---登陆功能,事件触发
    wp8使用mvvm模式简单例子
    win8.1使用WP8SDK出现Windows Phone Emulator无法启动的问题解决方案
    asp.net原理笔记----页面控件类型,页面状况和asp.net编译过程
    asp.net生命周期
    asp.net服务器数据源控件学习笔记
    AJax学习笔记
    asp.net敏感词过滤
    网上书城总结笔记
    在自己的网站上使用RSS订阅功能
  • 原文地址:https://www.cnblogs.com/koto/p/5692303.html
Copyright © 2011-2022 走看看