Nodeのイベントモジュールの簡単な分析

青灯夜游
リリース: 2023-02-21 19:43:28
転載
2264 人が閲覧しました

Nodeのイベントモジュールの簡単な分析

vue プロジェクトでは、コンポーネント間の通信を管理するためにグローバル イベント バスを使用することがあります。 vue2 プロジェクトでは、$emit$on、および $off を使用して、vue3 の eventHub; ## をカプセル化できます。 #$on $off が削除され、mitt ライブラリまたは tiny-emitter ライブラリを使用できます。ノードには、イベントの監視と発行に役立つイベント モジュールが組み込まれているため、それほど面倒な作業は必要ありません。

イベントの監視と発行

最初に CommonJS 構文を使用して

EventEmitter クラスをインポートし、次にインスタンス emitter を生成します。 ( EventEmitter は非常に重要です。たとえば、後続の記事で紹介する streamEventEmitter のインスタンスです):

const EventEmitter = require('events')
const emitter = new EventEmitter()
ログイン後にコピー

次に、

emitter .on() を使用してイベントを監視します。渡される最初のパラメータはイベント名です。2 番目のパラメータは、発行されるイベントをリッスンした後に実行されるコールバックです。イベントを発行するときにパラメーターが渡されます。コールバック関数の場合は、1 つずつ取得することも、次のように 関数の残りのパラメーターを使用することもできます。 [推奨関連チュートリアル: nodejs ビデオ チュートリアル, プログラミング教育]

1 回限りのイベントをリッスンする必要があるだけの場合は、

emitter.once()

: を使用できます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">emitter.once(&amp;#39;test&amp;#39;, () =&gt; { console.log(&amp;#39;监听到了事件发射&amp;#39;) }) emitter.emit(&amp;#39;test&amp;#39;) emitter.emit(&amp;#39;test&amp;#39;) // 本次发射不会触发打印</pre><div class="contentsignin">ログイン後にコピー</div></div>次の例に示すように、イベントを監視する場所が複数ある場合イベントが発行されると、リスニング コールバックが順番にトリガーされます:

emitter.on(&#39;test&#39;, () => {
  console.log(&#39;监听到了事件发射,1&#39;)
})
emitter.on(&#39;test&#39;, () => {
  console.log(&#39;监听到了事件发射,2&#39;)
})
emitter.emit(&#39;test&#39;)
ログイン後にコピー

実行結果:

Nodeのイベントモジュールの簡単な分析リッスン イベントを前面に追加したい場合は、

emitter.prependListener()

(または emitter.prependOnceListener()) を使用できます。事前にリッスンしますが、一度だけリッスンします): <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">emitter.on(&amp;#39;test&amp;#39;, () =&gt; { console.log(&amp;#39;监听到了事件发射,1&amp;#39;) }) emitter.prependListener(&amp;#39;test&amp;#39;, () =&gt; { console.log(&amp;#39;监听到了事件发射,2&amp;#39;) }) emitter.emit(&amp;#39;test&amp;#39;)</pre><div class="contentsignin">ログイン後にコピー</div></div>現在の結果は次のとおりです:

Nodeのイベントモジュールの簡単な分析

イベント リッスンの削除

emitter.off()

(または emitter.removeListener ()) を使用してイベントの監視を削除できますが、対応するイベント名とコールバックを渡す必要があります。したがって、監視時のコールバックは、上記のように emitter.on()## で直接定義できません # 内部。外部で定義し、コールバックへの参照を渡す必要があります:

function handler(...args) {
  console.log(args) // [ 1, 2, 3 ]
}
emitter.on(&#39;test&#39;, handler)
emitter.emit(&#39;test&#39;, 1, 2, 3) 
emitter.off(&#39;test&#39;, handler)
emitter.emit(&#39;test&#39;, &#39;无法被监听到&#39;)
ログイン後にコピー
emitter.off()

削除できるリスナーは 1 つだけであり、リスナー コールバックを渡す必要があります。複数のリスナーがあり、それらをすべて削除したい場合は、

emitter.removeAllListeners() を使用できます。 :

emitter.on(&#39;test&#39;, handler)
emitter.on(&#39;test&#39;, handler)
emitter.on(&#39;test&#39;, handler)

emitter.removeAllListeners()
ログイン後にコピー
emitter.removeAllListeners()

パラメータが渡されない場合は、すべてのイベント名のすべてのイベント リスナーを削除します。イベント名を渡すこともでき、そのイベント名に対応するすべてのイベント リスナーが削除されます。

その他のメソッド

リスナー数の制限

1 EventEmitter オブジェクト、イベント名の最大リスナー数のデフォルトは 10 です。これは、emitter.getMaxListeners()

:

console.log(emitter.getMaxListeners()) // 10
ログイン後にコピー
で確認できます。たとえば、11 回と書かれています。emitter .on('test ', handler)

を実行すると、エラーが報告され、

emitter.setMaxListeners() を使用して最大制限を増やすよう求められます:

現在の EventEmitter オブジェクト上の特定のイベント名にリスナーがいくつあるか、およびそれが最大制限を超えているかどうかを知りたい場合は、Nodeのイベントモジュールの簡単な分析emitter.listenerCount()

を使用して、表示するイベント名を渡します:

console.log(emitter.listenerCount(&#39;test&#39;))
ログイン後にコピー

イベント名とリスナーを取得します

Use emitter.eventNames()

現在の EventEmitter オブジェクトに登録されているすべてのイベント名と、イベント文字列で構成される返された配列を取得するには:

emitter.on(&#39;test1&#39;, handler)
emitter.on(&#39;test2&#39;, handler)

console.log(emitter.eventNames()) // [ &#39;test1&#39;, &#39;test2&#39; ]
ログイン後にコピー
イベントに対応するすべてのリスナーを取得したい場合は、emitter.listeners を使用できます。 ()

を入力し、イベント名を渡します:

function handler1() {}
function handler2() {}
emitter.on(&#39;test&#39;, handler1)
emitter.on(&#39;test&#39;, handler2)

console.log(emitter.listeners(&#39;test&#39;))
ログイン後にコピー
得られた結果は次のとおりです:

ノード関連の知識の詳細については、次のサイトを参照してください。 : Nodeのイベントモジュールの簡単な分析nodejs チュートリアル

!

以上がNodeのイベントモジュールの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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