Node.js は単一プロセスのシングルスレッド アプリケーションですが、V8 エンジンが提供する非同期実行コールバック インターフェイスにより、大量の同時実行を処理できるため、パフォーマンスは非常に高くなります。
Node.js のほぼすべての API はコールバック関数をサポートしています。
基本的に、Node.js のすべてのイベント メカニズムは、デザイン パターンのオブザーバー パターンを使用して実装されます。
Node.js のシングル スレッドは、イベント オブザーバーが終了するまで while(true) イベント ループに入るのと似ており、非同期イベントごとにイベント オブザーバーが生成され、イベントが発生するとコールバック関数が呼び出されます。
イベントドライバー
Node.js はイベント駆動型モデルを使用しており、Web サーバーはリクエストを受信すると、リクエストを閉じて処理し、次の Web リクエストを処理します。
リクエストが完了すると、リクエストは処理キューに戻され、キューの先頭に到達すると、結果がユーザーに返されます。
このモデルは、Web サーバーが読み取りまたは書き込み操作を待たずに常にリクエストを受け入れるため、非常に効率的でスケーラブルです。(これはノンブロッキング IO またはイベント駆動型 IO とも呼ばれます)
イベント駆動型モデルでは、イベントをリッスンするためにメイン ループが生成され、イベントが検出されるとコールバック関数がトリガーされます。
イベント駆動型プロセス全体がこの方法で実装され、非常に簡潔になります。オブザーバー パターンとある程度似ており、イベントはサブジェクト (Subject) に相当し、このイベントに登録されたすべてのハンドラーはオブザーバー (Observer) に相当します。
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
连接成功。
数据接收成功。
程序执行完毕。
Node アプリケーションはどのように機能しますか?
Node アプリケーションでは、非同期操作を実行する関数は最後の引数としてコールバック関数を受け取り、コールバック関数は最初の引数としてエラー オブジェクトを受け取ります。
次に、前の例に戻り、次の内容を含む input.txt を作成してみましょう。
csdn地址:https://blog.csdn.net/jewels_w?type=lately
次のコードを使用して 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() はファイルを読み取るための非同期関数です。ファイルの読み取り中にエラーが発生した場合、err オブジェクトはエラー メッセージを出力します。
エラーが発生しない場合、readFile は err オブジェクトの出力をスキップし、ファイルの内容はコールバック関数を通じて出力されます。
上記のコードを実行すると、実行結果は次のようになります。
程序执行完毕
csdn地址:https://blog.csdn.net/jewels_w?type=lately
次に、input.txt ファイルを削除します。実行結果は次のようになります。
程序执行完毕
Error: ENOENT, open 'input.txt'
input.txtというファイルが存在しないため、エラーメッセージが出力されます。