9

write()のドキュメントには次のように書かれています。

falseを返し、カーネルバッファがいっぱいであり、データが将来送信されることを示します。

drainイベントのドキュメントには次のように書かれています。

write()メソッドがfalseを返した後、このイベントが発行され、再度書き込みしても安全であることを示します。

どういう意味ですか?drainもう一度書く前に、イベントを待つ必要がありますか?書き込もうとしたデータはどうなりましたか?それは失われましたか?drainイベントを待たずにwriteを呼び出すとどうなりますか?

4

2 に答える 2

6

@TooTallNateの答えは間違っています。.write戻り値は絶対に気にする必要があります。

どういう意味ですか?再度書き込む前に、ドレインイベントを待つ必要がありますか?

はい、.writefalseを返す場合は、待つ必要があります。

書き込もうとしたデータはどうなりましたか?それは失われましたか?

いいえ、失われることはありません。正しい順序でバッファリングされます。

ドレインイベントを待たずにwriteを呼び出すとどうなりますか?

ドレインイベントを正しく処理しないと、スクリプトがイベントループをブロックし、最終的にメモリ制限を使い果たしてアプリケーションがクラッシュします。

私はこの他の質問で詳細な説明をします:なぜ大きな大きなファイルを書き込もうとするとjsヒープがメモリ不足になるのですか?

于 2019-02-01T14:10:43.683 に答える
5

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

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

だから通常、使うだけStream#pipe()ですべてのグッズがあなたのために世話をされます:)

于 2012-04-07T20:05:38.453 に答える