ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript EventEmitter の基礎となるロジックの分析

JavaScript EventEmitter の基礎となるロジックの分析

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-26 10:43:121246ブラウズ

今回は JavaScript EventEmitter の基礎となるロジック分析について説明します。JavaScript EventEmitter の基礎となるロジック分析の 注意事項 は何ですか。以下は実際的なケースです。見てみましょう。

イベント エミッターとは何ですか?

イベント エミッターは、イベントをトリガーするだけのように聞こえますが、あらゆるものがこのイベントをリッスンできます。

このシナリオを想像してください。非同期コードで、いくつかのイベントが発生するように「呼び出し」、あなたの他の部分にあなたの「呼び出し」を聞いてその考えを記録させます。

さまざまな目的に合わせて、イベント エミッター パターンのさまざまな実装が多数ありますが、基本的なアイデアは、イベント管理とイベントをサブスクライブする機能を備えたフレームワークを提供することです。

ここでの目標は、独自のイベント エミッターを作成して、その背後にある秘密を理解することです。それでは、以下のコードがどのように機能するかを見てみましょう。

えー

始めましょう。

let input = document.querySelector("input[type="text"]");
let button = document.querySelector("button");
let h1 = document.querySelector("h1");
button.addEventListener("click", () => {
  emitter.emit("event:name-changed", { name: input.value });
});
let emitter = new EventEmitter();
emitter.subscribe("event:name-changed", data => {
  h1.innerHTML = `Your name is: ${data.name}`;
});

最初に EventEmiiter クラスを作成し、イベントの空のオブジェクト プロパティを初期化します。このイベント属性の目的は、イベント コレクションを保存することです。このイベント オブジェクトは、イベント名をキーとして使用し、サブスクライバー コレクションを値として使用します。 (各サブスクライバーを関数として考えることができます)。

サブスクリプション関数

class EventEmitter {
  constructor() {
    this.events = {};
  }
}

このサブスクリプション関数はイベント名を取得します。前の例では、イベントが呼び出されたときの「event:name-changed" 以及传入一个回调,当有人调用 emit(またはスクリーム) コールバック」でした。

JavaScript の関数の利点の 1 つは、 function は最初のオブジェクトなので、前のサブスクリプション メソッドと同じように、関数を別の function のパラメーターとして渡すことができます

このイベントが登録されていない場合は、最初に初期値を設定する必要があります。イベント名をキーとして空の配列を初期化し、それに割り当てます。その後、関数をこの配列に配置して、このイベントを Emit を通じて呼び出します

関数を呼び出します

subscribe(eventName, fn) {
  if (!this.events[eventName]) {
    this.events[eventName] = [];
  }
  this.events[eventName].push(fn);
}

この呼び出し関数は、イベント名 (「呼び出し」たいイベント名)、およびこのイベントに渡したいデータ。このイベントがイベントに存在する場合、そのデータを使用してサブスクライブされたすべてのメソッドをループします。上記のコードは、前述したことをすべて実行できますが、必要がなくなったときにこれらのサブスクリプションを登録解除する方法が必要です。そうしないと、メモリ リークが発生してしまいます。サブスクリプション関数で未登録のメソッドを返すことで、この問題を修正しましょう。

emit(eventName, data) {
  const event = this.events[eventName];
  if (event) {
    event.forEach(fn => {
      fn.call(null, data);
    });
  }
}

JavaScript 関数は最初のオブジェクトであるため、次のように未登録の関数を呼び出すことができます。 unregister 関数を呼び出します。削除する関数は、サブスクリプション関数コレクション (配列フィルター) のフィルター方法によって異なります

メモリ リークに別れを告げましょう!

以上がJavaScript EventEmitter の基礎となるロジックの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。