Node.jsのイベントループ
Node.jsのは、シングルプロセス、シングルスレッドのアプリケーションですが、イベントとコールバックを経由して同時をサポートしているため、パフォーマンスが非常に高いです。
各Node.jsのAPIは非同期であり、非同期の関数呼び出し、および同時実行を使用して、別のスレッドとして実行されます。
実質的イベントメカニズムの全ては、設計モード観測モードを使用して実現されるのNode.js。
何の終了イベントオブザーバがなくなるまでのNode.jsは(真の)イベントループしながら、単一のスレッドを入力のようなイベントが発生しますが、コールバック関数が呼び出された場合、各非同期イベントは、イベントオブザーバを生成します。
イベントドリブンプログラミング
次のWebサービス要求に、処理のためにそれを先送りにした後、Webサーバが要求を受信した場合、イベント駆動型モデルを使用して、Node.jsを。
要求が完了すると、それが処理キューに戻され、それが最初に到達したキューは、結果がユーザに返されます。
このモデルは、Webサーバが任意の読み取りまたは書き込み操作を待たずに要求を受信されているため、非常に効率的なスケーラビリティが、非常に強いです。 (これは、非ブロッキングIOまたはイベント駆動型のIOとして知られています)
イベント駆動型モデルでは、イベントが検出されたときのイベントがコールバック関数をトリガするためにリッスンするメインループを生成します。
全体のプロセスは、達成すべく、イベント駆動型で非常に簡単です。 このイベントに登録されたすべてのハンドラは、観察者(オブザーバー)に対応しながら、オブザーバーパターンと少し似て、イベントは、テーマ(主題)と同等です。
Node.jsのは、我々はイベントモジュールの導入によることができ、複数の組み込みイベントであり、例えば次の持つEventEmitterクラスをインスタンス化することによって結合して、イベントをリッスンします:
// 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter = new events.EventEmitter();
イベントハンドラをバインド、次の手順:
// 绑定事件及事件的处理程序 eventEmitter.on('eventName', eventHandler);
私たちは、トリガイベントをプログラムすることができます。
// 触发事件 eventEmitter.emit('eventName');
例
main.jsファイルのファイルを作成し、以下のように、コードは次のとおりです。// 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter = new events.EventEmitter(); // 创建事件处理程序 var connectHandler = function connected() { console.log('连接成功。'); // 触发 data_received 事件 eventEmitter.emit('data_received'); } // 绑定 connection 事件处理程序 eventEmitter.on('connection', connectHandler); // 使用匿名函数绑定 data_received 事件 eventEmitter.on('data_received', function(){ console.log('数据接收成功。'); }); // 触发 connection 事件 eventEmitter.emit('connection'); console.log("程序执行完毕。");
それでは、上記のコードを実行してみましょう:
$ node main.js 连接成功。 数据接收成功。 程序执行完毕。
どのノード・アプリケーションは動作しますか?
最後のパラメータのコールバック関数が最初のパラメータとしてエラーオブジェクトを受信すると、ノード・アプリケーション機能では、非同期操作のコールバック関数を実行します。
次のように私たちは前の例で再見てみましょう、INPUT.TXTを作成し、文書が読み取ります。
本教程官网地址:w3big.com
次のように、main.jsファイルのファイルを作成します。
var fs = require("fs"); fs.readFile('input.txt', function (err, data) { if (err){ console.log(err.stack); return; } console.log(data.toString()); }); console.log("程序执行完毕");
fs.readFile上記のプログラムは、()は、非同期関数は、ファイルを読み取るために使用されています。 エラーは、ファイルを読み出す過程で発生した場合、エラーは、オブジェクトがエラーメッセージを出力します誤ります。
エラーなし場合、readFileの出力Errオブジェクトをスキップし、ファイルの内容は、コールバック関数を介して出力されます。
次のように上記のコードを実行し、実行結果は以下のとおりです。
程序执行完毕 本教程官网地址:w3big.com
次に、INPUT.TXTファイルの実行結果を削除次のとおりです。
程序执行完毕 Error: ENOENT, open 'input.txt'
INPUT.TXTファイルが存在し、このような場合には、エラーメッセージの出力されないため。