NodeJS イベントのイベントのチュートリアルの例

零下一度
リリース: 2017-06-26 11:48:38
オリジナル
1449 人が閲覧しました

前の言葉

イベントモジュールはノードのコアモジュールであり、http、fsなど、一般的に使用されるほとんどすべてのノードモジュールはイベントモジュールを継承します。この記事では、nodeJS のイベント メカニズムを詳しく紹介します

EventEmitter

ほとんどの Node.js コア API は、特定の種類のオブジェクト (トリガーと呼ばれる) が名前付きイベントを定期的にトリガーする慣用的な非同期イベント駆動型アーキテクチャを採用しています。関数オブジェクト (リスナー) を呼び出します。たとえば、net.Server オブジェクトは新しい接続が確立されるたびにイベントをトリガーし、fs.ReadStream はファイルが開かれたときにイベントをトリガーします。ストリームはデータが読み取り可能になったときにイベントをトリガーします。

【EventEmitter】

EventEmitterクラスは、イベントモジュールによって定義され、開かれます。イベントをトリガーできるすべてのオブジェクトは、EventEmitterクラスのインスタンスです

var EventEmitter = require('events');/*{ [Function: EventEmitter]
  EventEmitter: [Circular],
  usingDomains: false,
  defaultMaxListeners: [Getter/Setter],
  init: [Function],
  listenerCount: [Function] } */console.log(EventEmitter);
ログイン後にコピー

イベントモジュールのEventEmitter属性は、モジュール自体を指します

var events = require('events');
console.log(events.EventEmitter === events);//true
ログイン後にコピー

EventEmitter は、イベント ジェネレーター エミッターのインスタンスを生成するために使用できるコンストラクターです

var EventEmitter = require('events');var emitter = new EventEmitter();/*EventEmitter {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined } */console.log(emitter);
ログイン後にコピー

method

[emitter.emit(eventName[, ...args])]

eventName <any>...args <any>
ログイン後にコピー

このメソッドは、リスナーの登録シーケンスに基づいています。eventName という名前のイベントに登録された各リスナーは、指定されたパラメーターを渡して同期的に呼び出されます。イベントにリスナーがある場合はtrueを返し、そうでない場合はfalseを返す

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('test1',function(){});
console.log(emitter.emit('test1'));//trueconsole.log(emitter.emit('test2'));//false
ログイン後にコピー

【emitter.on(eventName,listener)】

このメソッドは、という名前のイベントのリスナー配列の最後にリスナー関数を追加するために使用されます。 eventName

eventName <any> 事件名
listener <Function> 回调函数
ログイン後にコピー
ログイン後にコピー

【注意】リスナーが追加されているかどうかはチェックしません。複数回呼び出して同じeventNameとlistenerを渡すと、リスナーが追加されて複数回呼び出されます

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
});
emitter.on('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
ログイン後にコピー

このメソッドはEventEmitter参照を返し、チェーンで呼び出すことができます

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).on('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
ログイン後にコピー

【emitter.addListener (eventName,listener) 】

emitter.on(eventName,listener)のエイリアス

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.addListener('test',function(){
    console.log(1);
});
emitter.emit('test');//1
ログイン後にコピー

【emitter.prependListener()】

on()メソッドとは異なり、prependListener()メソッドは次の目的で使用できます。イベントリスナーをリスナー配列に追加します Beginning

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).prependListener('test',function(){
    console.log(2);
});
emitter.emit('test');//2 1
ログイン後にコピー

【emitter.once(eventName,listener)】

このメソッドは、eventName という名前のイベントに 1 回限りのリスナー関数を追加します。 次回eventNameイベントがトリガーされると、リスナーは削除されてから

eventName <any> 事件名
listener <Function> 回调函数
ログイン後にコピー
ログイン後にコピー
var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).once('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2emitter.emit('test');//1
ログイン後にコピー

【emitter.prependOnceListener()】

このメソッドはリスナー配列の先頭にイベントリスナーを追加するために使用されます。次回、eventName イベントがトリガーされると、リスナーは削除され、その後、

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).prependOnceListener('test',function(){
    console.log(2);
});
emitter.emit('test');//2 1emitter.emit('test');//1
ログイン後にコピー

【emitter.removeAllListeners([eventName])]

eventName <any>
ログイン後にコピー
ログイン後にコピー

を呼び出して、指定されたeventNameのすべてのリスナーまたはリスナーを削除して戻ります。 EventEmitter 参照は、チェーンで呼び出すことができます

[注意] 特に EventEmitter インスタンスが他のコンポーネントまたはモジュール (ソケットやファイル ストリームなど) によって作成されている場合、コード内の他の場所に追加されたリスナーを削除することは悪い習慣です

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).removeAllListeners('test');
emitter.emit('test');//''
ログイン後にコピー

【emitter.removeListener(eventName,listener)】

eventName <any>listener 
ログイン後にコピー

指定されたリスナーをeventNameというイベントのリスナー配列から削除します

var EventEmitter = require('events');var emitter = new EventEmitter();function show(){
    console.log(1);
}
emitter.on('test',show).removeListener('test',show);
emitter.emit('test');//''
ログイン後にコピー

[注意]removeListenerは指定されたリスナーのみをリスナーから削除します最大でもリスナー インスタンスを削除します。単一のリスナーが指定されたeventNameのリスナー配列に複数回追加される場合、removeListenerを複数回呼び出して各インスタンスを削除する必要があります。リスナーは順番にトリガーされます。これは、イベントの発生後、最後のリスナーの実行が終了する前に、removeListener() または RemoveAllListeners() を呼び出しても、それらのリスナーは Emit() から削除されないことを意味します。 後続のイベントは期待どおりに発生します

リスナーは内部配列を使用して管理されるため、これを呼び出すと、リスナーが削除された後に登録されたリスナーの位置インデックスが変更されます。 これはリスナーが呼び出される順序には影響しませんが、emitter.listeners() メソッドによって返されるリスナー配列のコピーを再作成する必要があることを意味します

var EventEmitter = require('events');var emitter = new EventEmitter();function show(){
    console.log(1);
}
emitter.on('test',show).on('test',show).removeListener('test',show);
emitter.emit('test');//'1'
ログイン後にコピー

setup

【emitter.eventNames】 ()]

トリガーがリスナーを登録したイベントをリストする配列を返します。 配列内の値は文字列または記号です

var EventEmitter = require('events');var emitter = new EventEmitter();function show1(){
    console.log(1);
    emitter.removeListener('test',show2);
}function show2(){
    console.log(2);
}
emitter.on('test',show1).on('test',show2);
emitter.emit('test');//1 2emitter.emit('test');//1
ログイン後にコピー

【emitter.listenerCount(eventName)】

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.addListener('test1',function(){console.log(1);});
emitter.addListener('test2',function(){console.log(2);});
console.log(emitter.eventNames());//[ 'test1', 'test2' ]
ログイン後にコピー

eventNameという名前のイベントをリッスンしているリスナーの数を返します

eventName <any> 正在被监听的事件名
ログイン後にコピー

【emitter.listenerCount(eventName)】 listeners(eventName)]

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.addListener('test',function(){console.log(1);});
emitter.addListener('test',function(){console.log(1);});
console.log(emitter.listenerCount('test'));//2
ログイン後にコピー

eventName

eventName <any>
ログイン後にコピー
ログイン後にコピー
という名前のイベントのリスナー配列のコピーを返します

【emitter.getMaxListeners()】

  返回 EventEmitter 当前的最大监听器限制值

var EventEmitter = require('events');var emitter = new EventEmitter();
console.log(emitter.getMaxListeners());//10
ログイン後にコピー

【emitter.setMaxListeners(n)】

  默认情况下,如果为特定事件添加了超过 10 个监听器,则 EventEmitter 会打印一个警告。 此限制有助于寻找内存泄露。 但是,并不是所有的事件都要被限为 10 个。 emitter.setMaxListeners() 方法允许修改指定的 EventEmitter 实例的限制。 值设为 Infinity(或 0)表明不限制监听器的数量。返回一个 EventEmitter 引用,可以链式调用

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});/*Warning: Possible EventEmitter memory leak detected. 11 a listeners added. Use emitter.setMaxListeners() to increase limit */
ログイン後にコピー
var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.setMaxListeners(11);
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});
ログイン後にコピー

【EventEmitter.defaultMaxListeners】
  每个事件默认可以注册最多10个监听器。单个EventEmitter实例的限制可以使用emitter.setMaxListeners(n)方法改变。所有EventEmitter实例的默认值可以使用EventEmitter.defaultMaxListeners属性改变

  [注意]设置 EventEmitter.defaultMaxListeners 要谨慎,因为会影响所有EventEmitter 实例,包括之前创建的。因而,调用 emitter.setMaxListeners(n) 优先于 EventEmitter.defaultMaxListeners

var EventEmitter = require('events');var emitter = new EventEmitter();
EventEmitter.defaultMaxListeners = 11;
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});
ログイン後にコピー

 

事件

【'newListener' 事件】

eventName <any> 要监听的事件的名称
listener  事件的句柄函数
ログイン後にコピー

  EventEmitter 实例会在一个监听器被添加到其内部监听器数组之前触发自身的 'newListener' 事件

  注册了 'newListener' 事件的监听器会传入事件名与被添加的监听器的引用。事实上,在添加监听器之前触发事件有一个微妙但重要的副作用: 'newListener' 回调中任何额外的被注册到相同名称的监听器会在监听器被添加之前被插入 

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('newListener',function(){
    console.log(2);
})
emitter.on('test',function(){
    console.log(1);
})

emitter.emit('test');//2 1
ログイン後にコピー
var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
})
emitter.on('newListener',function(){
    console.log(2);
})
emitter.emit('test');//1
ログイン後にコピー

【'removeListener' 事件】

eventName <any> 事件名
listener  事件句柄函数
ログイン後にコピー

  'removeListener' 事件在 listener 被移除后触发

var EventEmitter = require('events');var emitter = new EventEmitter();function show(){
    console.log(1);
}
emitter.on('removeListener',function(){
    console.log(2);//2})
emitter.on('test',show).removeListener('test',show);
ログイン後にコピー
var EventEmitter = require('events');var emitter = new EventEmitter();function show(){
    console.log(1);
}
emitter.on('test',show).removeListener('test',show);
emitter.on('removeListener',function(){
    console.log(2);//''})
ログイン後にコピー
var EventEmitter = require('events');var emitter = new EventEmitter();function show(){
    console.log(1);
}
emitter.removeListener('test',show);
emitter.on('removeListener',function(){
    console.log(2);//''})
ログイン後にコピー

 

以上がNodeJS イベントのイベントのチュートリアルの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート