画像やファイルをダウンロードしたいと想像してみてください。これは、インターネットが教えてくれる最初の方法です。
request(url, function(err, res, body) {
fs.writeFile(filename, body);
});
しかし、これではすべてのデータが に蓄積されbody
、メモリがいっぱいになりませんか? はpipe
完全に効率的でしょうか?
request(url).pipe(fs.createWriteStream(filename));
それとも、これは同様の問題で内部的に処理され、とにかくストリームをバッファリングして、これを無関係にしますか?
さらに、コールバックを使用したいが (まだ使用できるため) を使用したくない場合、このメモリ バッファーはまだいっぱいになりますか?body
pipe
最初の(コールバック)メソッドを使用すると、ダウンロードを並行して起動する代わりに(*)ダウンロードをチェーンできるため、質問していますが、どちらも使用しないバッファを埋めたくありません。したがって、キューを使用してこれを防ぐためだけにasyncのような派手なものに頼りたくない場合は、コールバックが必要です。
(*)request
ファイルが完成する前にファイルが多すぎると、 の非同期の性質request
により、イベントの過剰摂取とメモリの損失でノードが窒息死するため、これは悪いことです。まず、次のものを取得します。
"possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit."
そして、それを拡張すると、500 のパイプ リクエストでメモリがいっぱいになり、ノードがクラッシュします。そのため、パイプの代わりにコールバックが必要なため、次のファイルをいつ開始するかがわかります。