Node.js のイベント モジュールについての学習とチャット

青灯夜游
リリース: 2021-12-24 18:18:27
転載
4150 人が閲覧しました

この記事では、Node.jsのイベント モジュールを理解し、イベントのパブリッシュおよびサブスクライブ モデルを紹介します。皆様のお役に立てれば幸いです。

Node.js のイベント モジュールについての学習とチャット

イベント モジュール

参考公式 Web サイト: events イベント トリガー | Node.js

http ://nodejs.cn/api/events.html

Eventsモジュールは Node の最も重要なモジュールであり、属性EventEmitter,# を提供します##EventEmitterの中核は、イベントの発行とイベント リスナーです。

Nodeのモジュールのほとんどは、Eventsモジュールから継承します。

  • Eventsモジュールは、Node のパブリッシュ/サブスクライブ モード(パブリッシュ/サブスクライブ) の実装です。 1 つのオブジェクトがこのモジュールを通じて別のオブジェクトにメッセージを渡します。
  • このモジュールは、
  • EventEmitter属性を通じてコンストラクターを提供します。このコンストラクターのインスタンスには、指定されたイベントをリッスンし、コールバック関数をトリガーするために使用できるonメソッドがあります。
  • 任意のオブジェクトは、指定されたイベントを発行できます。これらのイベントは、
  • EventEmitterインスタンスの on メソッドによって監視されます。

パブリッシュおよびサブスクライブ モデル

パブリッシュおよびサブスクライブ モデルについては、以前のブログ記事を参照してください。

Eventsのパブリッシュおよびサブスクライブ モデルに関しては、まずその一般的なメソッドのいくつかを理解する必要があります。

  • サブスクリプション メソッド:onメソッドは、イベントをサブスクライブするために使用されます。サブスクリプションは、メソッドを 1 対多の関係にマップします。
  • 公開メソッド:emitサブスクライブされたイベントを実行するために使用されます。
  • Unsubscribe:offメソッドは、対応するイベント リスナーを削除できます。
  • Subscribe Once:onceバインドされたイベントは、実行後にサブスクライブされたイベントを自動的に削除します。

on と Emit

onメソッドの最初のパラメータはクラス名を設定するために使用され、2 番目のパラメータは公開時に渡されるパラメータを受け取ることができる関数でもあります。

emitメソッドの最初のパラメータはクラス名で、後続のパラメータはonメソッド関数に渡されるパラメータです。

onおよびemit特定のアプリケーションについては、以下の簡単なデモを参照してください。

const EventEmitter = require('events'); // 自定义一个 构造函数 function Cat() {} // 原型继承 需要通过实例来调用继承方法 Object.setPrototypeOf(Cat.prototype, EventEmitter.prototype); let cat = new Cat(); const sleep = (a, b) => { console.log(a, '睡'); }; const eat = (a, b) => { console.log(b, '吃'); }; cat.on('猫咪', sleep) cat.on('猫咪', eat) setTimeout(() => { // 小胡子 吃 // 小胖仙 睡 cat.emit('猫咪', '小胖仙', '小胡子') }, 1000);
ログイン後にコピー

これで、

onメソッドとemitメソッドのセットを実装できます。

function EventEmitter() { this._event = {} } // on 方法 EventEmitter.prototype.on = function (eventName, callBack) { if (!this._event) { this._event = {} } if (this._event[eventName]) { this._event[eventName].push(callBack) // 相当于 {eventName:[fn1,fn2]} } else { this._event[eventName] = [callBack]; // 相当于 {eventName:[fn1]} } } // emit 方法 EventEmitter.prototype.emit = function (eventName, ...args) { this._event[eventName].forEach(fn => { fn(...args) }); }
ログイン後にコピー

off

offメソッドの最初のパラメータはクラス名を設定するために使用され、渡される 2 番目のパラメータは次のように指定する必要があります。関数コールバックを削除しました。

// ... setTimeout(() => { // 小胡子 吃 // 小胖仙 睡 cat.emit('猫咪', '小胖仙', '小胡子') cat.off('猫咪', sleep); // 小胡子 吃 cat.emit('猫咪', '小胖仙', '小胡子') }, 1000);
ログイン後にコピー

このようにして、渡した関数と同じ関数を大まかに判断して削除することができます。そこですぐに思いついたのが、

filterメソッドです。

// off 方法 EventEmitter.prototype.off = function (eventName, callBack) { if (this._event && this._event[eventName]) { this._event[eventName] = this._event[eventName].filter( fn => fn !== callBack && fn.c !== callBack // fn.c参考下面的once方法实现 ) } }
ログイン後にコピー

once

onceメソッドの最初のパラメータはクラス名を設定するために使用されます。2 番目のパラメータは渡され、必要なのは一度実行される関数コールバック。

// ... const demolition =() => { console.log('拆家'); } cat.once('猫咪', demolition) setTimeout(() => { // ...... 拆家 cat.emit('猫咪', '小胖仙', '小胡子') }, 1000);
ログイン後にコピー

したがって、以前に実装された

onoffに基づいてこのメソッドを実装できます。

// once 方法 EventEmitter.prototype.once = function (eventName, callBack) { const one = () => { callBack(); this.off(eventName, one); } this.on(eventName, one); }
ログイン後にコピー

このメソッドには何も問題はなく、すべて正しく実行されているようです。

しかし、特殊なケースでは、依然としてエラーが発生しました。

この状況は、

onceメソッドを実行する前にoffメソッドを通じて削除した場合です。

実装したメソッドはこの要件を満たすことができないため、

onceメソッドにいくつかの変更を加える必要があります (offメソッドはすでに処理されています) )

関数を「キャッシュ」するためのカスタム属性を追加します。

EventEmitter.prototype.once = function (eventName, callBack) { const one = () => { // ... } one.c = callBack; // 自定义一个属性 // ... }
ログイン後にコピー

このようにして、

onceメソッドを実装しました。

ノード関連の知識の詳細については、

nodejs チュートリアルを参照してください。 !

以上がNode.js のイベント モジュールについての学習とチャットの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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