ホームページ > 記事 > ウェブフロントエンド > Node.js の組み込みモジュール イベント、それを使用してパブリッシュおよびサブスクライブ モデルを実装する方法
パブリッシュ-サブスクライブモデルは誰もがよく知っているはずです。これは非同期対話において大きな役割を果たし、コード構造をより明確にし、読みやすく、保守しやすくします。
#node では
組み込みモジュール #event# を使用できます# # パブリッシュ/サブスクライブ モデルを実装するために、この記事では event
について詳しく学び、実際の開発におけるその役割を示します。それでは始めましょう! [関連チュートリアルの推奨事項: nodejs ビデオ チュートリアル ]
1. 初期使用
// 引入内置模块event
const EventEmitter = require("events");
##event
組み込みモジュールは基本的にコンストラクターは、new演算子
// 创建event对象 const event = new EventEmitter();イベントをリッスンする
を通じて呼び出す必要があります。 eventオブジェクトの
on 関数を使用して、リスニング イベントを定義します。構文は次のとおりです: event.on(イベント名, イベント処理関数)
<pre class="brush:php;toolbar:false">// 监听run事件
event.on("run", (data) => {
console.log("run事件运行,参数为:", data);
});</pre>
イベントのトリガー
event オブジェクトの Emit 関数を使用して、監視対象イベントをトリガーします。構文は次のとおりです:
event.emit (トリガーする必要があるイベントの名前)、イベント処理関数に渡す必要があるパラメーター)<pre class="brush:php;toolbar:false">// 触发run事件
event.emit("run", "111111");</pre>
#完全なコード
// 引入内置模块event const EventEmitter = require("events"); // 创建event对象 const event = new EventEmitter(); // 监听run事件 event.on("run", (data) => { console.log("run运行,参数为:", data); }); // 触发run事件 event.emit("run", "111111");実行結果:
❗️ 繰り返しイベントの監視に関する問題
#===注: 同じイベントが複数回監視される場合 イベントがトリガーされると、このイベントのすべてのイベント処理関数が同時にトリガーされます==
2. 前のステップのセクション
Node.js | バックエンド サーバーの構築 (組み込みモジュール http | の使用を含む) の # を適用します。const http = require("http"); const https = require("https"); // http和https的区别仅在于一个是http协议一个是https协议 const url = require("url"); const server = http.createServer(); server.on("request", (req, res) => { const urlObj = url.parse(req.url, true); res.writeHead(200, { "content-type": "application/json;charset=utf-8", "Access-Control-Allow-Origin": "http://127.0.0.1:5500", }); switch (urlObj.pathname) { case "/api/maoyan": // 我们定义的httpget方法:使node充当客户端去猫眼的接口获取数据 httpget((data) => res.end(data)); // 注意这里 break; default: res.end("404"); break; } }); server.listen(3000, () => { console.log("服务器启动啦!"); }); function httpget(cb) { // 定义一个存放数据的变量 let data = ""; // 因为猫眼的接口是https协议的,所以我们需要引入https // http和https都具有一个get方法能够发起get请求,区别是一个是http协议,一个是https协议 // http get方法第一个参数为接口地址,第二个参数为回调函数 https.get( "https://i.maoyan.com/api/mmdb/movie/v3/list/hot.json?ct=%E8%A5%BF%E5%8D%8E&ci=936&channelId=4", (res) => { // http get方法获取的数据是一点点返回的,并不是直接返回全部 // 监听data,当有数据返回时就会被调用 res.on("data", (chunk) => { // 收集数据 data += chunk; }); // 监听end,数据返回完毕后调用 res.on("end", () => { cb(data); // 注意这里 }); } ); }19 行目と 19 行目に注目してください。上記のコードの 49:
httpget((data) => res.end(data)); // 注意这里
cb(data); // 注意这里
この例では、
httpget 関数に渡します。
httpget 関数によって取得されたデータを受け取るコールバック関数を入力します。この書き方は実は問題なく、開発ではよく使われています。 ただし、場合によっては、特に 多層の入れ子関数が を呼び出す場合 (以下の例など)、コード構造があまり明確ではないため、この記述方法は十分に洗練されていません。そのロジックをあまり直観的に理解することはできません:
function user() { getUser((data) => { console.log(data); }); } function getUser(cb) { // .... const id = 1; getUserInfo(cb, id); } function getUserInfo(cb, id) { // .... const name = id + "Ailjx"; cb(name); }
組み込みモジュール
event を使用して、上記の nodesimulationget
リクエスト (クロスドメイン データを転送する場合):const http = require("http"); const https = require("https"); const url = require("url"); const EventEmitter = require("events"); const server = http.createServer(); // 存放event对象 let event = ""; server.on("request", (req, res) => { const urlObj = url.parse(req.url, true); res.writeHead(200, { "content-type": "application/json;charset=utf-8", "Access-Control-Allow-Origin": "http://127.0.0.1:5500", }); switch (urlObj.pathname) { case "/api/maoyan": event = new EventEmitter(); // 注意该位置 // 监听事件 event.on("resEnd", (data) => { res.end(data); }); httpget(); break; default: res.end("404"); break; } }); server.listen(3000, () => { console.log("服务器启动啦!"); }); function httpget() { let data = ""; https.get( "https://i.maoyan.com/api/mmdb/movie/v3/list/hot.json?ct=%E8%A5%BF%E5%8D%8E&ci=936&channelId=4", (res) => { res.on("data", (chunk) => { data += chunk; }); res.on("end", () => { // 触发事件并传递数据 event.emit("resEnd", data); }); } ); }
/api/maoyan インターフェイスを実行して呼び出します:
Interface
# を使用します。上記のコード new EventEmitter()
のの位置に注意してください。は外部です。グローバル/api/maoyanevent
オブジェクトは 1 つだけあります。
インターフェイスを呼び出すたびに、node は新しいイベントをリッスンします。
resEnd イベント、これにより、resEnd
イベントが 繰り返しリッスンされることになります
: したがって、
eventオブジェクトのコード
new EventEmitter()はインターフェースのcase
event オブジェクトが作成され、廃止された古い
event オブジェクトは JS
ガベージ処理メカニズムによって処理されるため、問題は発生しません。 resEnd
イベントが繰り返し監視されていますノード関連の詳細については、
nodejs チュートリアル
を参照してください。
以上がNode.js の組み込みモジュール イベント、それを使用してパブリッシュおよびサブスクライブ モデルを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。