ほとんどすべてのアプリケーション、どんなにシンプルなNode.jsの使用は、いくつかの方法でストリーム。
最初の恐怖を自分で開きます。図絵画、理解を深めるためのコードの分析。
ノードストリームを理解するためのシンプルな
- ストリームの基本的な考え方
- 書き込み可能 - ストリームデータ書き込み可能
- 読み取り可能 - ストリームデータを読み取ることができます
- ストリームのノード内の他のモジュールの応用
- 概要
基本的な概念を1.stream
1.1ストリームとは何ですか
1.コードを書くとき、私たちは一緒に接続プログラムのような水のようないくつかの接続方法を、持っている必要があります-私たちはいくつかのデータを取得する必要があるとき、あなたは他の部分を介して自分の目標を達成するために行くことができる「ツイスト。」これは、IOはそれが必要な方法であるべきです。- 。ダグ・マッキロイ1964年10月11日
ノードと関連して
抽象モデル(パイプのようなビット)、データの整然とした転送(水のようなビット)のようなストリームは、また、制御された大きさとすることができる緩め管によってポイントを取るために必要とされます。
- 書込み可能 - ストリーム(例えばfs.createWriteStream())データを書き込むことができます。
- 可読 - データストリームを読み取ることができる(例えばfs.createReadStream())。
- 二重 - 読み取りおよび書き込み可能なストリーム(例えばnet.Socket)。
- 変換 - 読み書きプロセスでは、変更することができるか、または変換されたデータは、二重の流れ(例えばzlib.createDeflate())。
1.Readable-ストリームデータを読み取ることができます
ストリームデータの1.1読みやすい簡潔な説明を読むことができます
読み込み可能なストリームは、データソースを抽象化したものです。水のための水のように、私たちは、消費者の使用を渡されます。
そこフロー可読ある二つのモードは、フローモードは、(流れる)または一時停止(一時停止します):
- フローモードを流し、データが自動的に基本となるシステムから読み出され、すぐに可能な限り「」データ「イベント持つEventEmitterインタフェースによりアプリケーションに提供されます。
- ポーズモードは、データがstream.readを呼び出すことによって、表示データを読み取る必要があり、一時停止()。
例えば1.2Readableデータ・ストリームを読み取ることができます
例えば:
可読{} =一定(「ストリーム」が必要); クラスmyReadableは可読{延び コンストラクタ(オプション、ソース){ スーパー(オプション) この = .sourcesをソース この .POS = 0 } // 継承クラスが可読_readを実装する必要があります()プライベートメソッドは、メソッドが読み取り可能なクラスの内部で呼び出される // _read()が呼び出されたときに、リソースをデータから読み込まれた場合、読み取りキューにデータをプッシュするthis.push(dataChunk)を使用して開始する必要があります。 // _read())(readable.pushまで、データリソースからプッシュデータを読み取るために継続すべきであるがfalseを返す
//()一時的(readable.pushを理解し、プッシュ(ヌル)は偽を返す) _read(){ IF(この .POS < 本.sources.length){ この .push(この .sources [この.POS]) この .POS ++ } 他{ この .push(ヌル) } } } のlet RS = 新しい新しい myReadableは({}、「私は羅布午前、私は水資源へのどこかだった」) letがwaterCupは =「」 // リスナーにバインドするときに「データ」イベント、フローストリームモードに変換されます。 // ときに、消費者のトリガーへのデータブロック転送の流れ。 rs.on( 'データ'、(チャンク)=> { にconsole.log(チャンク); // チャンクがバッファである waterCup + = チャンク }) rs.on( '終了'、()=> { にconsole.log(「完全な消費を読みます」); コンソールが。 })
上記のコードをデバッグするから開きます。
おそらくこの数字は本当に良いを見ていない:(流れる塗料のフローチャートのパターンのビットは、それの背中を見ることをお勧めします)
_read同期動作する最初のプッシュ・データ・ストレージである()関数、及びその後this.buffer可変this.buffer変数から取り出し、EMIT(「データ」、チャンク)消費
非同期動作は、プッシュ方式と呼ばれると、非同期プッシュある_read()関数、及びデータ、直接放出する。このとき(「データ」、チャンク)消費。
パターンの簡素化: