node.js で EventEmitter をカスタマイズする方法

node.js で EventEmitter をカスタマイズする方法

序文

最近、卸売商品の需要があり、さまざまな商人に対応する卸売商品を選択し、元のインターフェースに表示する必要があります。プロジェクトのコードは会社にとって古いレベルであるため(この種のコードはプログラマーにとって厄介なものです)、問題を解決する際には非常に慎重になります。この問題を回避し、外部依存性を減らすには、イベントディスパッチ関数を手動でカプセル化します。

1. 何ですか

Node はイベント駆動メカニズムを使用しており、EventEmitter は Node がイベント駆動を実装するための基礎となっています。EventEmitter に基づいて、Node のほぼすべてのモジュールがこのクラスを継承します。これらのモジュールには独自のイベントがあり、リスナーをバインド/トリガーして非同期操作を実装できます。
Node.js の多くのオブジェクトはイベントをディスパッチします。たとえば、fs.readStream オブジェクトは、ファイルが開かれたときにイベントをトリガーします。イベントを生成するこれらのオブジェクトは、events.EventEmitter のインスタンスです。これらのオブジェクトには、1 つ以上の関数を名前付きイベントにバインドするために使用される eventEmitter.on() 関数があります。

2. Node.jsでEventEmitterを使用する方法

Node のイベント モジュールは、Node の非同期イベント駆動型アーキテクチャの基本パターンであるオブザーバー パターンを実装する EventEmitter クラスのみを提供します。このパターンでは、監視対象 (サブジェクト) は、他のオブジェクトによって送信 (登録) されたオブザーバーのグループを維持します。新しいオブジェクトがサブジェクトに関心がある場合は、オブザーバーを登録し、関心がない場合は登録を解除します。サブジェクトが更新されると、オブザーバーに通知が送信されます。

const EventEmitter = require('events')
クラス MyEmitter は EventEmitter を拡張します {}
定数 myEmitter = 新しい MyEmitter()
関数コールバック() {
    console.log('イベントがトリガーされました!')
}
myEmitter.on('イベント'、コールバック)
myEmitter.emit('イベント')
myEmitter.removeListener('イベント'、コールバック);

3. 実施プロセス

基本的なコードは次のとおりです。

//イベントディスパッチメカニズム(function() {
    var イベントディスパッチャー = 関数() {
        var イベントディスパッチャークロージャ = 関数() {

        };
        イベントディスパッチャークロージャ.プロトタイプ = {
            /**
             * イベントを登録 * @param {Object} キー
             * @param {オブジェクト} fn
             */
            オン: 関数(キー, fn) {
                //現在のイベント オブジェクトを取得します。var curEvents = this._getCurEvents(key);
                //まずイベントが登録されているかどうかを確認します var flag = false;
                (var i = 0, len = curEvents.length; i < len; i++) {
                    もしcurEvents[i].name == fn.nameであれば{
                        //すでに登場していますが、最後に登録された関数はメイン flag = true です。
                        curEvents[i] = fn;
                        壊す;
                    }
                }
                if (!フラグ) {
                    curEvents[curEvents.length] = fn;
                }
                this._register(キー、curEvents);
            },
            /**
             * イベントのディスパッチ * @param {Object} キー
             * @param {オブジェクト} データ
             */
            ディスパッチ: 関数(キー) {
                //現在のイベント オブジェクトを取得します。var curEvents = this._getCurEvents(key);
                var shouldDispatch = true;
                (var i = 0, len = curEvents.length; shouldDispatch && i < len; i++) {
                    試す {
                        //パラメータを取得する var args = [];
                        (var j = 1, len1 = arguments.length; j < len1; j++) {
                            args.push(引数[j]);
                        }
                        shouldDispatch = curEvents[i].apply({}, args);
                    } キャッチ (e) {
                        ディスパッチ = false である必要があります。
                    }
                }
                shouldDispatch を返します。
            },
            削除: 関数(キー) {
                if (this._getCurEvents(キー)) {
                    EventDispatcherClosure.events[キー]を削除します。
                }
            },
            /**
             * キーに基づいてイベントリストを取得します * @param {Object} key
             */
            _getCurEvents: 関数(キー) {
                EventDispatcherClosure.events[key] || [] を返します。
            },
            /**
             * 登録時間* @param {Object} キー
             * @param {Object} イベント
             */
            _register: 関数(キー、イベント) {
                EventDispatcherClosure.events[キー] = events;
            },
        };
        イベントディスパッチャークロージャ.イベント = {};
        戻る {
            作成: 関数() {
                新しいEventDispatcherClosure()を返します。
            }
        };
    };
    window.EventDispatcher = 新しい EventDispatcher().create();
})();

まず、グローバル変数の匿名関数を定義し、開発プロセス中に呼び出せるように、グローバル変数をウィンドウに表示します。匿名関数のプロトタイプ チェーンに、イベント配布、イベント監視、イベント削除などのメソッドを追加します。

イベントディスパッチコール

EventDispatcher.dispatch("テスト", obj)

イベントリスニング

EventDispatcher.on("test", 関数コールバック(obj) {
})

イベントの削除

EventDispatcher.on("テスト")

コードのカプセル化は比較的シンプルです

これで、Node.js で EventEmitter の実装をカスタマイズする方法についての記事は終了です。Node.js で EventEmitter を実装する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Node.js をゼロから学ぶシリーズ チュートリアル 6: EventEmitter がイベントを送受信する例
  • Node.js events.EventEmitter の使い方の紹介
  • node.js で events.EventEmitter.listenerCount メソッドを使用する手順

<<:  Linux サーバー上のローカル静的リソースにアクセスするために nginx を使用する方法

>>:  MySQL クエリ フィールド タイプが json の場合の 2 つのクエリ メソッド

推薦する

Docker-compose を使用して ELK クラスターを構築する方法

すべてのオーケストレーション ファイルと構成ファイルは、私の Github からアクセスできます。構...

MySQL 8.0 で列を素早く追加する方法

序文: MySQL 8.0 では高速な列追加がサポートされ、数秒で大きなテーブルにフィールドを追加で...

CSS3 カウントダウン効果

成果を達成する実装コードhtml <div クラス = 'ラッパー'> ...

js に基づいて大きなファイルのアップロードとブレークポイントの再開を管理する方法

目次序文フロントエンド構造バックエンド構造(ノード+エクスプレス) FormDataに基づくファイル...

MySQL実践スキル: 2つのテーブルに異なるデータがあるかどうかを比較する方法の分析

この記事では、MySQL が 2 つのテーブルを比較して、異なるデータがあるかどうかを確認する方法を...

MySQL インデックスの種類 (通常、ユニーク、フルテキスト) の説明

MySQL のインデックスの種類には、通常のインデックス、一意のインデックス、全文インデックスがあり...

MySQL データベース監視ソフトウェア lepus の使用上の問題と解決策

lepus3.7 を使用して MySQL データベースを監視中に、次の問題が発生しました。このブログ...

Nginx のパフォーマンスを向上させるための提案

Web アプリケーションが 1 台のマシンでのみ実行される場合、パフォーマンスを向上させるのは非常に...

HTML のテキストエリア タグ

<textarea></textarea> は、複数行を入力できるテキスト ...

MySQL データベース ターミナル - 一般的な操作コマンド コード

目次1. ユーザーを追加する2. ユーザー名とホストを変更する3. パスワードを変更する4. ユーザ...

Layuiテーブルは指定された行のラジオボタンを選択し、その行の実装コードまでスクロールします。

layui テーブルには複数行のデータがあります。外部入力コンテンツを通じて、指定された行を見つけ...

MySQLのトランザクション特性とレベル原則の分析

1. トランザクションとは何ですか?データベース トランザクション (略称: トランザクション) は...

nginx.conf のルートディレクトリ設定の詳細な説明

nginx.conf を構成するときには常に何らかの問題が発生します。ここでは、よくある問題とその解...

CentOS に MySQL 8.0 をインストールして設定するための詳細な手順

序文CentOS に MySQL をインストールして設定する手順は次のとおりです。文章yumソースか...

Vueプロジェクトがグラフィック検証コードを実装

この記事の例では、グラフィック検証コードを実装するためのVueプロジェクトの具体的なコードを参考まで...