ホームページ >ウェブフロントエンド >jsチュートリアル >Nodejsのイベントモジュールの詳細な分析

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

青灯夜游
青灯夜游転載
2021-03-01 10:41:214888ブラウズ

この記事では、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 までご連絡ください。