2012-04-07 10 views
8

documentation for write()は言う:偽Node.jsの書き込み可能なストリームとドレインイベント

戻り値は、カーネルバッファがいっぱいであることを示すために、データが将来的に送信されます。

drainイベントのドキュメントは言う:write()メソッドがfalseを返された後

、このイベントは、再び書き込むことが安全であることを示すために放出されます。

これは何を意味しますか?私はもう一度書くことができる前にdrainイベントを待たなければなりませんか?私が書き込もうとしたデータには何が起こったのですか?それは失われていますか? drainイベントを待たずに書き込みを呼び出すとどうなりますか?

答えて

6

write()に電話することができます。戻り値を気にする必要はありません。ノードは、カーネルバッファが一杯になっている間に書き込み呼び出しをバッファし、期待どおりに順番に押します。 は、再度書き込む前に'drain'イベントを待つ必要がありません。

オプションで、戻り値write()を確認してから、ストリームに書き込んでいるものにバッファがいっぱいであることを通知できます。これはまさにStream#pipe() doesです。

ので、通常は、ちょうどStream#pipe()を使用すると、すべてのグッズはあなたのための世話をしている:)あなたは `process.exitを呼び出す場合はどうなり

+1

()' 'res.write'は、まだユーザメモリにバッファリングされている間(つまり、カーネルバッファにフラッシュされません)?応答は失われますか? – Emmett

+0

@Emmettバッファリングされた書き込み呼び出しがフラッシュされている間に 'process.exit()'を呼び出すと、そのデータは失われます。 – TooTallNate

+1

戻り値を気にせずにwrite()を呼び出すことは完全に安全ではありません。 [current docs](https://nodejs.org/dist/v8.4.0/docs/api/stream.html)は次のように言っています:_ "流出していないストリーム上で' write() 'を呼び出すことは許されていますが、Node .jsは、メモリ使用量が最大になるまで、すべての書き込みチャンクをバッファリングします。その時点で、無条件に中断します。メモリが大量に使用されると、ガベージコレクタのパフォーマンスが低下し、RSSが高くなりますメモリがもう必要なくなった後)」_も参照してください:https://stackoverflow.com/q/37579605 – TachyonVortex

関連する問題