2012-04-07 71 views
8

documentation for write()說:Node.js的可寫流和漏事件

返回FALSE以表明內核緩衝區已滿,數據將在未來被髮送出去。

,爲drain事件的文件說:

一個write()方法後返回false,發出此事件,以表明它是安全的再次寫入。

這是什麼意思?在我能夠再次寫作之前,是否必須等待drain事件?我試圖寫的數據發生了什麼?這是失去了嗎?當我在不等待drain事件的情況下致電寫入時會發生什麼?

回答

6

您可以致電write()而不必關心安全返回值。當內核緩衝區已滿時,節點將緩衝任何寫入調用,並按照您的預期按順序推送它們。你不要需要等待'drain'事件再次寫入之前。

(可選)您可以檢查返回值write(),然後通知正在寫入流的緩衝區已滿的內容。這正是Stream#pipe() does

所以通常情況下,只需使用Stream#pipe()和所有的好東西都被認真考慮爲你:)

+1

如果你打電話'process.exit會發生什麼()',而'res.write'仍緩存在用戶存儲器(即不刷新到內核緩衝區)?響應是否會丟失? – Emmett 2014-04-23 21:32:45

+0

@Emmett是的,如果你在調用'process.exit()'的時候有緩衝的寫入調用還要刷新,那麼這些數據將會丟失。 – TooTallNate 2014-05-25 15:55:07

+1

「調用write()'而不關心返回值並不完全安全」。 [當前文檔](https://nodejs.org/dist/v8.4.0/docs/api/stream.html)說:_「雖然在不排水的流上調用write(),但Node .js將緩衝所有寫入的塊,直到最大內存使用率發生,此時它將無條件地中止。即使在中止之前,高內存使用率也會導致較差的垃圾收集器性能和較高的RSS(通常不會釋放回系統,甚至之後不再需要內存)。「_另請參閱:https://stackoverflow.com/q/37579605 – TachyonVortex 2017-08-27 14:34:06