ディレクトリ
2. eventEmitterクラスのさまざまなメソッドの詳細な説明
2.1バインディングイベント(addListenerまたはon)
2.5 setMaxListenersは、イベントハンドラーのイベントバインディングの最大数を指定します
2.6 getMaxListenersイベントハンドラーのイベントバインディングの最大数を取得する
2.7指定したイベントによってバインドされたすべてのイベント関数を取得する
3.listenerCountは、指定されたイベントのハンドラーの数を取得します
1.eventEmitterクラス
さまざまなタイプのイベントを実装するためのイベントモジュール。すべての可能な時間オブジェクトは、eventEmitterクラスを継承するサブクラスのインスタンスです。
通常、イベントモジュールの下のeventEmitterクラスが直接使用されます
const EventEmitter = require('events').EventEmitter;
// 直接使用EventEmitter类实例
const myEmitter = new EventEmitter;
1.1 EventEmitterクラスのさまざまなメソッド
メソッド名とパラメーター | 説明文 |
addListener(イベント、リスナー) | イベントハンドラーを指定したイベントにバインドする |
on(event、listener) | イベントハンドラーを指定されたイベントにバインドします(addListenrerと比較して)。 |
一度(イベント、リスナー) |
指定されたイベントに対してイベント処理関数を1回だけ実行します |
removeListener(イベント、リッスン) | 指定したイベントのイベントハンドラー関数を削除する |
off(イベント、リッスン) | 指定されたイベントのイベントハンドラー関数を削除します(もう少し使用) |
removeAllListens(イベント) | 指定したイベントのすべてのイベントハンドラーをキャンセルします |
setMaxListeners(n) | 指定されたイベントにバインドできるイベントハンドラー関数を設定します。 |
リスナー(イベント) | 指定されたイベントのすべてのバインドされた関数を取得します |
エミット(イベント、[arg1]、[arg2]、[...]) | トリガーイベントを手動でトリガーする |
2. eventEmitterクラスのさまざまなメソッドの詳細な説明
2.1バインディングイベント(addListenerまたはon)
addListenerメソッドは基本的にonメソッドと同じです
(event、listen)のaddListener(event、listen)は2つのパラメーターを受け入れます
- 最初のパラメーターは、バインドされたイベントの名前です
- 2番目のパラメーターはイベントハンドラー関数です。
const {EventEmitter} = require("events")
// 定义子类
class Emitter extends EventEmitter{}
// 创建实例
const emitter = new Emitter()
// 绑定事件
emitter.addListener("con", function() {
console.log("我是addListener方法")
})
emitter.on("con", function() {
console.log("我是addListener方法")
})
// 触发事件
emitter.emit('con')
// 事件可以连续触发
emitter.emit('con')
emitter.emit('con')
emitter.emit('con')
実行結果:
2.2出力メソッドがイベントをトリガーする
出力はパラメータを受け入れることができます:
エミッター。エミット(「再生」、「パラメーター1」、「パラメーター2」)
- 最初のパラメーターは、イベントをトリガーしたイベントの名前です(必須)。
- イベントハンドラー関数によって渡される2番目のパラメーターと後続のパラメーター
// 普通触发事件
emitter.emit('someEvents')
// 触发事件的时候传递参数
// 绑定事件
emitter.on("someevent", function () {
console.log(arguments) // 打印结果: [Arguments] { '0': '参数1', '1': '参数2' }
})
// 触发事件
emitter.emit('play','参数1','参数2')
2.3イベントを一度だけバインドする
一度バインドされたイベントは一度だけ実行され、実行が完了すると自動的にバインド解除されます
const {EventEmitter} = require("events")
// 定义子类
class Emitter extends EventEmitter{}
// 创建实例
const emitter = new Emitter()
// 绑定事件
emitter.once('play',function() {
console.log("我是play方法>_<")
})
//执行事件
emitter.emit('play');
//多次执行事件
emitter.emit('play');
emitter.emit('play');
実行結果(複数の実行イベントの後、イベントは引き続き1回だけ実行されます)
2.4アンバインドイベント
イベントをバインドするとき、同じイベント名で複数のイベントをバインドできます
- removeListener
- offListener
- removeAllListeners
1.removeListener(イベント、リスナー)
2つのパラメーターを受け入れます。
- 最初のパラメーターは、指定されたイベント名です
- 2番目のパラメーターは、バインド解除する必要があるイベントハンドラー関数を指定することです
removeListener()
多くても、リスナー配列から削除されるリスナーは1つだけです。リスナーが指定されたeventName
リスナー配列に複数回追加された場合、removeListener()
すべてのインスタンスを削除するには、リスナーを複数回呼び出す必要があり ます。イベントがトリガーされると、イベントにバインドされたすべてのリスナーが順番に呼び出されます。リスナーが完了する前に、イベントがトリガされた後、この手段、および前回の実行
removeListener()
またはremoveAllListeners()
からではないemit()
、それらを取り除きます。
//绑定事件
emitter.on("play",foo1);
emitter.on("play",foo2);
emitter.on("play",foo3);
function foo1() {
console.log('我是foo1');
}
function foo2() {
console.log('我是foo2');
}
function foo3() {
console.log('我是foo3');
}
//触发事件
setInterval(()=> {
emitter.emit('play');
},1000)
//设置3s之后解绑foo2
setInterval(()=> {
emitter.removeListener("play",foo2);
},3000);
実装の効果は次のとおりです。
powerShellでは、「ctrl + c」クラスを使用してイベントの実行を停止できます
2. offメソッドは、指定されたイベントのイベント関数を解放します
removeListenerメソッドと同様に、2つのパラメーターも受け入れます
removeListenerメソッドと本質的な違いはありません。メソッド名のみが異なります
emitter.off("play",foo2);
3. removeAllLIstenersは、指定されたイベント名の下にバインドされたすべてのイベントハンドラーを削除します
パラメータを次のように受け入れます:指定されたイベント名
5秒後、バインドされたすべてのイベント関数をキャンセルします
setInterval(()=> {
emitter.removeAllListeners("play");
},5000);
removeAllListenersメソッドがパラメーターを渡さない場合、すべてのイベントの名前の下にあるすべてのイベント処理関数がバインドされていないことを意味します
2.5 setMaxListenersは、イベントハンドラーのイベントバインディングの最大数を指定します
あなたはより具体的なイベントのためのより追加した場合、デフォルトで、
10
リスナー、それはEventEmitter
警告を出力します。これは、メモリリークの発見に役立ちます。ただし、すべてのイベントに10
リスナーが必要なわけではありません 。emitter.setMaxListeners()
このメソッドは、指定されたEventEmitter
インスタンスの制限を変更でき ます。Infinity
(または0
)に設定された値 は、リスナーの数が制限されないことを意味します。
デフォルトでは、同じイベント名を最大10個のイベントハンドラーにバインドするか、setMaxListenersを使用して変更できます。
// 设置最大事件处理函数绑定个数
emitter.setMaxListeners(12)
それは注目に値します:
- 10個を超えるイベントハンドラー関数が同じイベント名にバインドされている場合、プロンプトが表示され、プログラムは引き続き実行されます
- イベント処理関数の最大数がバインディングイベントの数以上である場合、プロンプトエラーは発生しません
2.6 getMaxListenersイベントハンドラーのイベントバインディングの最大数を取得する
console.log(emitter.getMaxListeners());
印刷された結果は私が以前に設定した12です
2.7指定したイベントによってバインドされたすべてのイベント関数を取得する
console.log(emitter.listeners('play'));
印刷結果は配列です
3.listenerCountは、指定されたイベントのハンドラーの数を取得します
このメソッドは2つのパラメーターを受け入れます
- 最初のパラメーターは、バインディングイベントのインスタンスオブジェクトです。
- 2番目のパラメーターは、バインドされたイベントの名前です
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(EventEmitter.listenerCount(myEmitter, 'event'));
// Prints: 2
4. eventEmitterクラス自体が所有するイベント
4.1 newListenerイベント
EventEmitterクラスを継承するすべてのサブクラスインスタンスオブジェクトは、イベントハンドラーにバインドされると、newListenerイベントをトリガーします。
EventEmitter
インスタンスは、新しいリスナーが内部リスナー配列に追加される前に、独自の'newListener'
イベントをトリガーします 。
'newListener'
イベントに登録された リスナーは、イベント名と追加するリスナーへの参照を渡します。
リスナーが追加される前にイベントがトリガーされるという事実には、微妙ですが重要な副作用があり
'newListener'
ます。コールバックで同じイベントに 登録されているname
他のリスナーは、リスナーが追加される前に挿入されます。
const {EventEmitter} = require("events");
// 定义子类
class emitter extends EventEmitter{};
// 创建实例
const myEmitter = new emitter();
// 只处理一次,避免无限循环。
myEmitter.once('newListener', (event, listener) => {
if (event === 'event') {
// 在前面插入一个新的监听器。
myEmitter.on('event', () => {
console.log('B');
});
}
});
myEmitter.on('event', () => {
console.log('A');
});
myEmitter.emit('event');
// 打印:
// B
// A
4.2 removeEmitterイベント
EventEmitterクラスを継承するサブクラスインスタンスオブジェクトのイベントハンドラー関数がキャンセルされると、removeListenerイベントがトリガーされます
removeListenerイベントは、リスナーが削除された後にトリガーされます。
2つのパラメーターを受け入れます。
最初のパラメーターは、指定されたイベント名です
2番目のパラメーターは、バインド解除する必要があるイベント関数です
// 绑定事件
emitter.on("someevent", fn1)
emitter.on("someevent", fn2)
emitter.on("newevent", fn2)
// 事件处理函数
function fn1() {
console.log("someevent fn1")
}
function fn2() {
console.log("someevent fn2")
}
emitter.removeListener("someevent", fn1) // 每次取消事件绑定都会执行removeListener事件
私の記事では、より一般的に使用されるイベントのいくつかを簡単に紹介しましたが、まだ言及されていないイベントがたくさんあります。詳細については、nodeの公式Webサイトにアクセスしてドキュメントを読んでください