Nodejsのイベントモジュールの詳細な分析

青灯夜游
リリース: 2021-03-01 10:41:21
転載
4833 人が閲覧しました

この記事では、node のイベント モジュールについて詳しく紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

Nodejsのイベントモジュールの詳細な分析

関連する推奨事項: 「nodejs チュートリアル

イベント モジュールはノードのコア モジュールであり、一般的に使用されるほぼすべてのノードです。モジュールはそれを継承します。 イベント モジュール (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);
ログイン後にコピー

The EventEmitter 属性は、EventEmitter クラスです。 events モジュールが指すモジュール自体

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'));//true
console.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( ) メソッドを使用して、リスナー配列の先頭にイベント リスナーを追加できます。

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イベントに追加します。次回、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 2
emitter.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 1
emitter.emit('test');//1
ログイン後にコピー

[emitter.removeAllListeners([eventName])]

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

を呼び出して、すべてのリスナーまたはリスナーを削除します。チェーン内で呼び出すことができる 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 は、リスナー配列から最大 1 つのリスナー インスタンスのみを削除します。単一のリスナーが指定されたeventNameのリスナー配列に複数回追加される場合、各インスタンスを削除するにはremoveListenerを複数回呼び出す必要があります

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'
ログイン後にコピー

[注意] イベントがトリガーされると、すべてのバインドがそのイベントへのリスナーによって行われます。順番にトリガーされます。これは、イベントの発生後、最後のリスナーの実行が終了する前に RemoveListener() または RemoveAllListeners() を呼び出しても、それらは Emit() から削除されないことを意味します。後続のイベントは期待どおりに発生します。リスナーは内部配列を使用して管理されるため、これを呼び出すと、リスナーが削除された後に登録されたリスナーの位置インデックスが変更されます。これはリスナーが呼び出される順序には影響しませんが、emitter.listeners() メソッドによって返されるリスナー配列のコピーを再作成する必要があることを意味します

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 2
emitter.emit('test');//1
ログイン後にコピー

Settings

[emitter.eventNames( )]

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

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' ]
ログイン後にコピー

[emitter.listenerCount(eventName)]

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

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
ログイン後にコピー
# という名前のイベントをリッスンしているリスナーの数を返します。 # #【emitter.listeners(eventName)】

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

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.addListener('test',function(){console.log(1);});
emitter.addListener('test',function(){console.log(2);});
console.log(emitter.listeners('test'));//[ [Function], [Function] ]emitter.listeners('test')[0]();//1
ログイン後にコピー
【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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!