ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js のイベント モジュールについての学習とチャット

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

青灯夜游
青灯夜游転載
2021-12-24 18:18:274186ブラウズ

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