イベント駆動型とパブリッシュ・サブスクライブ型イベント駆動型アーキテクチャは、パブリッシュ/サブスクライブ パターンまたはオブザーバー パターンと呼ばれるソフトウェア開発の一般的なパターンに基づいて構築されます。 イベント駆動型アーキテクチャには、主体と観察者という少なくとも 2 つの参加者が存在します。 被験者は FM ラジオのように動作し、被験者の発言を聞きたい視聴者に放送します。 観察者が 1 人しかいなくても 100 人いても、対象者が放送するメッセージがある限り、それは問題ではありません。 イベント駆動型、パブリッシュ/サブスクライブ型、およびオブザーバー パターンは実際には同じではありませんが、理想的には同じアプローチを使用します。つまり、1 つのエンティティがメッセージをブロードキャストし、他のエンティティがそれをリッスンします。 パブリッシュ/サブスクライブパターンは私と同じくらい古いものです。 1987 年頃から理論化が始まり、オブザーバー パターンは 1994 年に「Gang of Four」によって書かれた「Design Patterns」という本に登場しました。 ブラウザの JavaScript ではイベント駆動型プログラミングはどのように使用されますか?エンジンの助けを借りて、JavaScript をブラウザで実行できます。 最も人気のある JavaScript エンジンは、Google Chrome と Node.js で使用される V8、Firefox で使用される SpiderMonkey、Safari/WebKit で使用される JavaScriptCore です。 豊富な環境に基づいて、JavaScript エンジンは言語を強化し、イベント駆動型の JavaScript プラットフォームも提供します。 実際、ブラウザ内の JavaScript は、イベント エミッター、つまりイベントを送信できるオブジェクトである HTML 要素と対話できます。 次の簡単な例、ボタン付きの HTML ドキュメントを考えてみましょう。 <!DOCTYPE html> <html lang="ja"> <ヘッド> <メタ文字セット="UTF-8"> <title>JavaScript における「イベント駆動型」とはどういう意味ですか?</title> </head> <本文> <div> <button id="subscribe">購読</button> </div> </本文> </html> JavaScript がなければ、ボタンは機能しません。現在、HTML ボタンは HTMLButtonElement タイプの要素であり、すべての HTML 要素と同様に、すべての HTML 要素の共通の祖先である EventTarget に接続されています。 ブラウザのイベント ターゲットは、イベントを発行できるオブジェクトです。つまり、オブザーバー パターンのサブジェクトです。 ちょっとわかりにくいですか?覚えておいてください: テーマは FM ラジオなので、HTML 要素はすべてラジオ局のように動作します。 すぐに観察者が誰であるかがわかります。 ブラウザにおける主体と観察者HTML 要素が主体である場合、観察者は誰でしょうか?リスナーとして登録された JavaScript 関数は、ブラウザ内のイベントに反応できます。 JavaScript を使用して HTML 要素を選択するには: const btn = document.getElementById('subscribe'); そして、addEventListener を使用してリスナーを登録します。 const btn = document.getElementById('subscribe'); btn.addEventListener("クリック", 関数() { console.log("ボタンがクリックされました"); }); ここで、「クリック」はイベント、ボタンはサブジェクトまたは送信者、関数はリスナーまたはオブザーバーです。 要約すると: HTML 要素はイベント エミッターです。 JavaScript でリスナーとして登録された関数はオブザーバーです。 これらのコンポーネントはすべて、小さなイベント駆動型アーキテクチャを構成します。コードをテストするには、次の HTML コンテンツをファイルに保存し (または Codepen で試し)、ボタンをクリックして、ブラウザ コンソールを確認します。 <!DOCTYPE html> <html lang="ja"> <ヘッド> <メタ文字セット="UTF-8"> <title>JavaScript における「イベント駆動型」とはどういう意味ですか?</title> </head> <本文> <div> <button id="subscribe">購読</button> </div> </本文> <スクリプト> const btn = document.getElementById('subscribe'); btn.addEventListener("クリック", 関数() { console.log("ボタンがクリックされました"); }); </スクリプト> </html> 次のセクションでは、Node.js で使用される同じ概念について説明します。 Node.js ではイベント駆動型プログラミングはどのように機能しますか?Node.js は、ブラウザ外部 (コマンドライン ツールとサーバー側) で実行される V8 エンジンに基づく JavaScript 環境です。 Node.js で行う作業のほとんどはイベントベースです。常に送信者オブジェクトと、メッセージをリッスンするいくつかのオブザーバーが存在します。 Node.js には HTML 要素がないため、ほとんどのイベントはプロセス、ネットワークとのやり取り、ファイルなどから発生します。 Node.js のすべてのイベント エミッターには、少なくとも 2 つの引数を取る on と呼ばれるメソッドがあります。
実際の例を見てみましょう。このシンプルな Node.js サーバーを見てみましょう。 定数net = require("net"); const server = net.createServer().listen(8081, "127.0.0.1"); server.on("listening", 関数() { console.log("サーバーがリッスンしています!"); }); server.on("接続", 関数(ソケット) { console.log("クライアントが接続されました!"); socket.end("こんにちはクライアント!"); }); このコードは、localhost のポート 8081 でリッスンするサーバーを作成します。サーバー オブジェクトでは、on メソッドを呼び出して 2 つのリスナー関数を登録します。 リスニング イベントはサーバーの起動直後に発生し、接続イベントはクライアントが 127.0.0.1:8081 に接続したときに発生します (試してみてください)。 この例では、サーバーがイベントの送信者、つまり件名です。一方、リスナー関数はオブザーバーです。 しかし、それらのオンメソッドはどこから来るのでしょうか? EventEmitterを理解するNode.js のすべてのイベント駆動型モジュールは、EventEmitter と呼ばれるルート クラスを拡張します。前の例では、net モジュールのネットワーク サーバーは EventEmitter を使用しました。 Node.js の EventEmitter には、on と emitting という 2 つの基本メソッドがあります。 ブラウザに対応させたい場合、EventEmitter はイベントを発行できる任意の HTML 要素と考えることができます。 ブラウザでイベントをリッスンするには、subject オブジェクトで addEventListener を呼び出します。 const btn = document.getElementById('subscribe'); btn.addEventListener("クリック", 関数() { console.log("ボタンがクリックされました"); }); 対照的に、Node.js では次のようになります。 // 省略 server.on("listening", () => { console.log("サーバーがリッスンしています!"); }); // 省略 正確に言うと、EventEmitter には addListener メソッドもあります。 on はその別名です。 EventEmitter には、カスタム イベント (メッセージ) をブロードキャストするときに便利な emitting メソッドもあります。 EventEmitter を使用する場合は、「events」モジュールからインポートしてイベントを発行します。 const EventEmitter = require("イベント"); const エミッター = 新しい EventEmitter(); emittingter.on("customEvent", () => console.log("イベントが発生しました!")); エミッター.emit("カスタムイベント"); Node.js でコードを実行すると、コンソールに「Got event」と表示されます。 JavaScript におけるオブザーバー/パブリッシュ/サブスクライブの他の例JavaScript にはオブザーバー オブジェクトのネイティブ サポートはありませんが、言語にオブザーバー オブジェクトを追加する提案があります。 RxJS は、オブザーバー パターンを JavaScript に導入するライブラリです。 Redux は、JavaScript でのパブリッシュ/サブスクライブ パターンの実装です。 これは、状態の変化がすべてのリスニング オブザーバーに配信される非常に優れたイベント エミッターです。 最新のブラウザには、オブザーバー パターンの別の例である Intersection Observer API が付属しています。 Socket.IO はイベントを多用するライブラリです。 要約するこの記事から何か新しいことを学んでいただければ幸いです。多くの用語を学びますが、すべては約 30 年前に発明されたパブリッシュ サブスクライブというパターンに帰着します。 このパターンはオブザーバーとも呼ばれ、現在 JavaScript と Node.js で使用されているイベント駆動型アーキテクチャの基礎となります。 もう一度言いますが、イベント駆動型、パブリッシュ/サブスクライブ型、およびオブザーバー パターンは同一ではありません。イベント駆動型アーキテクチャはパブリッシュ/サブスクライブ型の上に構築され、オブザーバー パターンは DOM や Node.js イベントよりも豊富です。 しかし、彼らは皆同じ家族の一員です。 上記は、JS と Nodejs におけるイベント駆動の詳細についての簡単な説明です。JS と Nodejs におけるイベント駆動の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: MySQL SQL ステートメント分析とクエリ最適化の詳細な説明
>>: フロントエンドとバックエンドを分離した nginx 構成を展開するための完全な手順
この記事では、MySQL テーブル データのインポートおよびエクスポート操作について説明します。ご参...
1. 各関数はオブジェクトであり、メモリを占有します。メモリ内のオブジェクトが増えるほど、パフォーマ...
mha4mysql をインストールする場合の手順は、おおよそ次のようになります: unzip、per...
1. フォントのプロパティcolorは、div{color:red;}のようにテキストの色を指定しま...
目次序文実際の戦闘1. ロックなし2. 悲観的ロック3. 楽観的ロック要約する序文悲観的ロックと楽観...
フロントエンドとバックエンドを分離し、nginxを使用してクロスドメインの問題を解決するフロントエン...
序文:今日、「<!DOCTYPE> タグを注意深く理解しましたか?」と尋ねられました。私...
1. テスト環境名前バージョンセント7.6ドッカー18.09.06 2. オンラインインストールここ...
目次1. インデックスの種類1. B+ツリー2. MyISAM と InnoDB の B+ ツリー ...
カーネル: [root@opop ~]# cat /etc/centos-release CentO...
Canvas は HTML5 の新しいタグです。js を使用して Canvas 描画 API を操作...
目次CentOS7環境での設定コマンド手順1. DHCP設定ファイルを設定する2. グローバル構成を...
目次1. DHCP サービス (動的ホスト構成プロトコル) 1. 背景2. 概要3. 利点4.DHC...
水平線<hr /> タグを使用して、現在の位置に水平の分割線を描画します。例: XML/...
この記事ではUbuntuでC++インターフェースを使用してopencvをインストールする方法について...