Node.jsのイベント処理の仕組みを詳しく解説

高洛峰
リリース: 2016-12-05 10:59:42
オリジナル
1057 人が閲覧しました

EventEmitterクラス

様々なイベント処理を実装するNode.jsのイベントモジュールには、EventEmitterクラスが定義されています。イベントをトリガーするすべてのオブジェクトは、EventEmitter クラスのサブクラスを統合するインスタンス オブジェクトです。Node.js では、オブジェクトのイベント処理関数のバインドとバインド解除に関連するすべての処理が、EventEmitter クラスに定義されています。これらのメソッドを呼び出します。

EventEmitterクラスの各種メソッド

event:イベント名を表します

listener:イベント処理関数を表します

カッコ内のパラメータはオプションのパラメータであることを表します

Node.jsのイベント処理の仕組みを詳しく解説

EventEmitter クラス

var http = require("http");
var server = http.createServer();
server.on("request", function(req, res){
 console.log(req.url);
 res.end();
});
server.listen(1337, "127.0.0.1");
ログイン後にコピー

このコードでは、サーバーがクライアント要求を受信したときに、クライアントによって要求されたターゲットの URL アドレスをコンソール ウィンドウに出力し、応答オブジェクトの end メソッドを使用して、応答を直ちに終了します。

コードを実行し、ブラウザウィンドウに http://localhost:1337:// と入力すると、コンソール出力は次のようになります:

Node.jsのイベント処理の仕組みを詳しく解説

コンソール出力

もちろん、複数のコマンドを使用することもできます。メソッド 複数のイベント ハンドラーを同じイベントにバインドするために実行されます。次のように:

var http = require("http");
var server = http.createServer();
 
server.on('request', function(req, res){
 console.log('接收到客户端请求')
})
 
server.on("request", function(req, res){
 console.log('处理客户端请求')
 console.log(req.url);
 res.end();
})
 
server.on('request', function(req, res){
 console.log('发送响应完毕')
})
 
server.listen(1337, "127.0.0.1");
ログイン後にコピー
ログイン後にコピー

OK、コードを実行すると、コンソール出力は次のようになります:

Node.jsのイベント処理の仕組みを詳しく解説

コンソール出力

さらに、デフォルトでは、最大 10 個の時間処理関数を同じ指定された関数にバインドできます。イベント。 setMaxListeners メソッドを通じてバインドできるイベント処理関数の最大数を変更できます。メソッドは次のとおりです。

emitter.setMaxListeners(n)
ログイン後にコピー

EventEmitter クラスの Once メソッド

EventEmiiter クラスの Once メソッドも同様です。 on メソッドに追加され、その機能は指定されたイベントをバインドすることです。違いは、イベント処理関数が 1 回実行されると、すぐに接続されることです。つまり、イベント処理関数は 1 回だけ実行されるということです。次のように、once メソッドで使用されるパラメーターは on メソッドで使用されるパラメーターと同じです。

emitter.once(event, listener)
ログイン後にコピー

実験を行います。

または、次のコードを実行します (上記と同じ):

var http = require("http");
var server = http.createServer();
 
server.on('request', function(req, res){
 console.log('接收到客户端请求')
})
 
server.on("request", function(req, res){
 console.log('处理客户端请求')
 console.log(req.url);
 res.end();
})
 
server.on('request', function(req, res){
 console.log('发送响应完毕')
})
 
server.listen(1337, "127.0.0.1");
ログイン後にコピー
ログイン後にコピー

次に、ブラウザ ウィンドウで 127.0.0.1:1337 を 2 回続けて開きます。コンソール出力は次のようになります:

Node.jsのイベント処理の仕組みを詳しく解説

は 2 回表示されます

次に、on イベントを Once イベントに変更します。コードは次のとおりです:

var http = require("http");
var server = http.createServer();
 
server.once('request', function(req, res){
 console.log('接收到客户端请求')
})
 
server.on("request", function(req, res){
 console.log('处理客户端请求')
 console.log(req.url);
 res.end();
})
 
server.once('request', function(req, res){
 console.log('发送响应完毕')
})
 
server.listen(1337, "127.0.0.1");
ログイン後にコピー

コンソールの出力は次のとおりです:

Node.jsのイベント処理の仕組みを詳しく解説

リクエストは 2 回処理され、残りは 1 回だけ出力されます!

removeListener メソッドを使用してイベント ハンドラーをキャンセルします

コードは次のとおりです:

var http = require("http");
var server = http.createServer();
var testFunction = function (req,res) {
 console.log('发送响应完毕')
}
 
server.on('request', function(req, res){
 console.log('接收到客户端请求')
})
 
server.on("request", function(req, res){
 console.log('处理客户端请求')
 console.log(req.url);
 res.end();
})
 
server.on('request', testFunction)
//删除
server.removeListener('request', testFunction)
server.listen(1337, "127.0.0.1");
ログイン後にコピー

コードを実行し、ブラウザ ウィンドウに 127.0.0.1:1337 と入力します。コンソール出力は次のようになります

Node.jsのイベント処理の仕組みを詳しく解説

コンソール出力

emitメソッド: イベントをカスタマイズしてトリガーします

コードは次のとおりです:

var http = require("http");
var server = http.createServer();
 
server.on("request", function(req, res){
 console.log(req.url);
});
 
//自定义事件
server.on("customEvent", function(arg1, arg2, arg3){
 console.log("自定义事件被触发");
 console.log(arg1);
 console.log(arg2);
 console.log(arg3);
});
 
//触发自定义事件
server.emit('customEvent', '自定义参数1', '自定义参数2', '自定义参数3')
server.listen(1337, "127.0.0.1");
ログイン後にコピー

今回は、ブラウザウィンドウにアドレスを入力する代わりに、コードを直接実行してコンソール出力を表示します。コンソール出力は次のとおりです:

Node.jsのイベント処理の仕組みを詳しく解説

コンソール出力

カスタム イベント (customEvent) を手動でトリガーしたことを示します。

概要

上記がこの記事の全内容です


この記事の内容が、node.jsを学習している、または使用しているすべての人に役立つことを願っています。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!