ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js の組み込みモジュール イベント、それを使用してパブリッシュおよびサブスクライブ モデルを実装する方法

Node.js の組み込みモジュール イベント、それを使用してパブリッシュおよびサブスクライブ モデルを実装する方法

青灯夜游
青灯夜游転載
2022-09-23 20:11:191438ブラウズ

パブリッシュ-サブスクライブモデルは誰もがよく知っているはずです。これは非同期対話において大きな役割を果たし、コード構造をより明確にし、読みやすく、保守しやすくします。

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(&quot;run&quot;, (data) =&gt; {     console.log(&quot;run事件运行,参数为:&quot;, data); });</pre> イベントのトリガー

event オブジェクトの Emit 関数を使用して、監視対象イベントをトリガーします。構文は次のとおりです:

event.emit (トリガーする必要があるイベントの名前)、イベント処理関数に渡す必要があるパラメーター)

<pre class="brush:php;toolbar:false">// 触发run事件 event.emit(&quot;run&quot;, &quot;111111&quot;);</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");
実行結果:

❗️ 繰り返しイベントの監視に関する問題Node.js の組み込みモジュール イベント、それを使用してパブリッシュおよびサブスクライブ モデルを実装する方法

#===注: 同じイベントが複数回監視される場合 イベントがトリガーされると、このイベントのすべてのイベント処理関数が同時にトリガーされます==

2. 前のステップのセクション

Node.js | バックエンド サーバーの構築 (組み込みモジュール http | の使用を含む) の

Node.js の組み込みモジュール イベント、それを使用してパブリッシュおよびサブスクライブ モデルを実装する方法

# を適用します。

get リクエスト (ドメイン データ間での転送) をシミュレートするために node

を使用するものがあります:

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

# を使用します。上記のコード Node.js の組み込みモジュール イベント、それを使用してパブリッシュおよびサブスクライブ モデルを実装する方法new EventEmitter()

の位置に注意してください。は外部です。グローバル

event

オブジェクトは 1 つだけあります。
/api/maoyan

インターフェイスを呼び出すたびに、node は新しいイベントをリッスンします。 resEnd イベント、これにより、resEnd イベントが 繰り返しリッスンされることになります : したがって、 eventオブジェクトのコードnew EventEmitter()はインターフェースのcase

ブランチに書き込まれるため、このインターフェースを呼び出すと、新しい

eventNode.js の組み込みモジュール イベント、それを使用してパブリッシュおよびサブスクライブ モデルを実装する方法 オブジェクトが作成され、廃止された古い

event

オブジェクトは JS ガベージ処理メカニズムによって処理されるため、問題は発生しません。 resEnd イベントが繰り返し監視されていますノード関連の詳細については、nodejs チュートリアル を参照してください。

以上がNode.js の組み込みモジュール イベント、それを使用してパブリッシュおよびサブスクライブ モデルを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。