NodeJSのeventsモジュール

7676 ワード

記事の目次
  • 1 Eventsモジュール
  • 1.1概要
  • 1.1.1基本用法
  • 1.1.2 on方法
  • 1.1.3 emit方法
  • .EventEmitterインターフェースの展開
  • 1.3イベントタイプ
  • 1.4 EventEmitterの例の方法
  • 1.4.1オンス方法
  • .removeListener方法
  • .removeAllListeners方法
  • 1.4.4 listener方法
  • 1 Eventsモジュール
    1.1概要
    1.1.1基本的な使い方
  • Eventsモジュールは、Nodeによる「発行/購読」モード(publish/subscribe)の実現である.一つのオブジェクトはこのモジュールを通して、他のオブジェクトにメッセージを伝えます.
  • このモジュールは、EventEmitter を介して構成関数を提供する.このコンストラクタの例は、指定されたイベントを傍受するために使用できるon方法を有し、コールバック関数をトリガする.
  • の任意のオブジェクトは、指定されたイベントを発行することができ、EventEmitterの例のon方法によって傍受される.次の例では、まずメッセージセンターを作成し、その後、on方法によって、各種イベントのためのコールバック関数を指定して、プログラムをイベント駆動型に変更し、各モジュール間でイベントを通じて連絡します.
  • var EventEmitter = require('events').EventEmitter;
    var ee = new EventEmitter();
    ee.on('someEvent', function () {
      console.log('event has occured');
    });
    function f() {
      console.log('start');
      ee.emit('someEvent');
      console.log('end');
    }
    
    f()
    // start
    // event has occured
    // end
    
    上記のコードは、eventsモジュールをロードした後、EventEmitter を介してEventEmitter の例を確立し、この例はメッセージセンターであり、on方法によってsomeEventイベントのためのコールバック関数を指定した後、emit方法によってsomeEvent をトリガする.上記のコードも、EventEmitter のイベントトリガと傍受が同期されていることを示している.
    1.1.2 on方法
    デフォルトの場合、Node.jsは、同じイベントを最大10 に指定できるようにする.
    ee.on("someEvent", function () { console.log("event 1"); });
    ee.on("someEvent", function () { console.log("event 2"); });
    ee.on("someEvent", function () { console.log("event 3"); });
    
    10個以上のコールバック関数が警告されます.このしきい値はsetMaxListeners によって変更できる.
    ee.setMaxListeners(20);
    
    1.1.3 eit方法
    EventEmitterの例のemit は、イベントをトリガするために使用される.その最初のパラメータはイベント名で、残りのパラメータは順次コールバック関数に伝えられます.
    var EventEmitter = require('events').EventEmitter;
    var myEmitter = new EventEmitter;
    var connection = function(id){
      console.log('client id: ' + id);
    };
    myEmitter.on('connection', connection);
    myEmitter.emit('connection', 6);
    
    1.2 EventEmitterインターフェースの配置Eventsモジュールの役割は、他のモジュールがEventEmitter を配置してもよく、メッセージを定期購読して発表することができることでもある.
    var EventEmitter = require('events').EventEmitter;
    
    function Dog(name) {
      this.name = name;
    }
    
    Dog.prototype.__proto__ = EventEmitter.prototype;
    //      
    // Dog.prototype = Object.create(EventEmitter.prototype);
    
    var simon = new Dog('simon');
    
    simon.on('bark', function(){
      console.log(this.name + ' barked');
    });
    
    setInterval(function(){
      simon.emit('bark');
    }, 500);
    
    上のコードは、構造関数Dogを新規に作成し、EventEmitterを継承させるので、DocgはEventEmitterのインターフェースを持っています.最後に、Docgの例のためにBarkイベントの傍受関数を指定し、EventEmitteremit方法を再使用して、barkイベントをトリガする.Nodeは、モジュールutilを内蔵するinherits方法を提供し、別の継承EventEmitter を提供する.
    var util = require('util');
    var EventEmitter = require('events').EventEmitter;
    
    var Radio = function(station) {
    
        var self = this;
    
        setTimeout(function() {
            self.emit('open', station);
        }, 0);
    
        setTimeout(function() {
            self.emit('close', station);
        }, 5000);
    
        this.on('newListener', function(listener) {
            console.log('Event Listener: ' + listener);
        });
    };
    
    util.inherits(Radio, EventEmitter);
    
    module.exports = Radio;
    
    上記のコードでは、Radioは構成関数であり、その例はEventEmitterインターフェースを継承している.以下はこのモジュールを使用した例です.
    var Radio = require('./radio.js');
    
    var station = {
      freq: '80.16',
      name: 'Rock N Roll Radio',
    };
    
    var radio = new Radio(station);
    
    radio.on('open', function(station) {
      console.log('"%s" FM %s   ', station.name, station.freq);
      console.log('♬ ♫♬');
    });
    
    radio.on('close', function(station) {
      console.log('"%s" FM %s   ', station.name, station.freq);
    });
    
    1.3イベントタイプ
    Eventsモジュールはデフォルトで二つのイベントをサポートします.
  • newListenerイベント:新しいコールバック関数を追加すると、トリガ
  • が起動されます.
  • RemoveListenerイベント:コールバックを除去するときにトリガ
  • ee.on("newListener", function (evtName){
      console.log("New Listener: " + evtName);
    });
    
    ee.on("removeListener", function (evtName){
      console.log("Removed Listener: " + evtName);
    });
    
    function foo (){}
    
    ee.on("save-user", foo);
    ee.removeListener("save-user", foo);
    
    // New Listener: removeListener
    // New Listener: save-user
    // Removed Listener: save-user
    
    上記のコードは、2回のnewListenerイベントと、removeListenerイベントをトリガします.
    1.4 EventEmitterの例の方法
    1.4.1オンス方法
    この方法はon法と類似しているが、コールバック関数は一回だけトリガされる.
    var EventEmitter = require('events').EventEmitter;
    var myEmitter = new EventEmitter;
    
    myEmitter.once('message', function(msg){
      console.log('message: ' + msg);
    });
    
    myEmitter.emit('message', 'this is the first message');
    myEmitter.emit('message', 'this is the second message');
    myEmitter.emit('message', 'welcome to nodejs');
    
    上記のコードは3回のmessageイベントをトリガしましたが、コールバック関数は1回目の起動時のみ実行されます.下のコードで指定します.サーバーが接続されると、一回だけのコールバック関数です.
    server.once('connection', function (stream) {
      console.log('Ah, we have our first user!');
    });
    
    この方法はEventEmitter に戻るので、傍受関数をチェーンでロードすることができる.
    1.4.2 removeListener方法
    この方法は に用いられる.これは2つのパラメータを受け入れています.最初は で、2番目は です.つまり、匿名関数を削除するためには使用できません.
    var EventEmitter = require('events').EventEmitter;
    
    var emitter = new EventEmitter;
    
    emitter.on('message', console.log);
    
    setInterval(function(){
      emitter.emit('message', 'foo bar');
    }, 300);
    
    setTimeout(function(){
      emitter.removeListener('message', console.log);
    }, 1000);
    
    上のコードは300ミリ秒ごとにメッセージイベントをトリガし、1000ミリ秒後に傍受をキャンセルします.他の例は、removeListener方法を用いてオンス方法をシミュレートすることである.
    var EventEmitter = require('events').EventEmitter;
    
    var emitter = new EventEmitter;
    
    function onlyOnce () {
        console.log("You'll never see this again");
        emitter.removeListener("firstConnection", onlyOnce);
    }
    
    emitter.on("firstConnection", onlyOnce);
    
    1.4.3 removeAllListeners方法
    この方法は、あるイベントのすべてのコールバック関数を削除します.
    var EventEmitter = require('events').EventEmitter;
    var emitter = new EventEmitter;
    // some code here
    emitter.removeAllListeners("firstConnection");
    
    パラメータがない場合は、すべてのイベントを削除するすべてのコールバック関数を表します.
    emitter.removeAllListeners();
    
    1.4.4 listener方法
    この方法は、 と呼び、イベントのすべてのコールバック関数からなる配列を返すことができる.
    var EventEmitter = require('events').EventEmitter;
    var ee = new EventEmitter;
    function onlyOnce () {
        console.log(ee.listeners("firstConnection"));
        ee.removeListener("firstConnection", onlyOnce);
        console.log(ee.listeners("firstConnection"));
    }
    
    ee.on("firstConnection", onlyOnce)
    ee.emit("firstConnection");
    ee.emit("firstConnection");
    
    // [ [Function: onlyOnce] ]
    // []
    
    上のコードは2回のコールバック関数からなる配列を示しています.最初は1つのコールバック関数OnlyOnceだけです.2回目は1つの空配列です.removeListener法がコールバック関数をキャンセルしたからです.