第6章Node.jsのイベントループ

Node.jsのは、単一のプロセス、シングルスレッドアプリケーションであるが、非同期コールバックインターフェースV8エンジンが提供起因して、これらのインタフェースを介して同時の多数を扱うことができるので、性能は非常に高いです。
Node.jsのAPIは、ほぼすべてのコールバック関数によってサポートされています。
Node.jsのは、実質的にイベントメカニズムのすべては、設計モードオブザーバ・モードで実装されています。
イベントは、コールバック関数と呼ばれて発生した場合、何の出口イベントオブザーバ存在しなくなるまでのNode.jsはシングルスレッドながら(真)イベントループに入ると同様であり、各非同期イベントは、イベントオブザーバを生成します。

6-1イベント駆動型プログラミング

その後、Node.jsのイベント駆動型Webサーバがリクエストを受信したモデルと、それを先送りにして、Webサービスに次の要求するように処理。

リクエストが完了すると、それはキューが最初に到達したときに、結果がユーザーに返され、処理キューをバックに置かれています。

このモデルは、ウェブサーバは、任意の読み取りまたは書き込み操作を待たずに要求を受信して​​いるため、非常に効率的な拡張性は、非常に強いです。(これは、イベント駆動型、非ブロッキングIOまたはIOとして知られています)

イベント駆動型モデルでは、それはイベントを監視するためのメインループが生成され、イベントが検出されたコールバック関数がトリガー。
3168340-bf4a213c7f7ab664.jpg
画像

全体イベント駆動型のプロセスは非常にシンプルなので、達成可能です。オブザーバーパターンにいくらか類似し、イベントがテーマ(主題)に相当し、このイベントの処理機能は、登録されたすべての観察者(観察)と等価です。

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を作成し、文書が読み取ります。

菜鸟教程官网地址:www.runoob.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上記のプログラム()関数は非同期です。エラーは、ファイルの読み出し処理で発生した場合、誤差errオブジェクト出力エラーメッセージがなります。

エラーが発生していない場合、readFileのは、出力Errオブジェクトをスキップし、文書には、コールバック関数によって出力されます。

上記のコードは次のように実行結果は、実行されます。

程序执行完毕
菜鸟教程官网地址:www.runoob.com

次は、次のような結果があり、INPUT.TXTファイルを削除します。

程序执行完毕
Error: ENOENT, open 'input.txt'

INPUT.TXTファイルが存在し、そのエラーメッセージの出力はありませんので。

おすすめ

転載: blog.csdn.net/weixin_33716557/article/details/90934148