9

write()的文档说:

返回 false 表示内核缓冲区已满,以后会发出数据。

事件的文件drain说:

在 write() 方法返回 false 后,会发出此事件以指示再次写入是安全的。

这意味着什么?我必须等待drain事件才能再次写作吗?我试图写入的数据发生了什么?那是丢了吗?当我在不等待drain事件的情况下调用 write 会发生什么?

4

2 回答 2

6

@TooTallNate 答案是错误的。你应该绝对关心.write返回值。

这意味着什么?我是否必须等待排水事件才能再次写入?

是的,当.write返回 false 时,您必须等待。

我试图写入的数据发生了什么?那是丢了吗?

不,它没有丢失,它以正确的顺序缓冲。

当我在没有等待排水事件的情况下调用 write 会发生什么?

如果您没有正确处理 drain 事件,您的脚本将阻塞事件循环,并最终耗尽内存限制使您的应用程序崩溃。

我在另一个问题中给出了详细解释:为什么尝试写入大文件会导致js堆内存不足

于 2019-02-01T14:10:43.683 回答
5

您可以安全地调用write()而不关心返回值。当内核缓冲区已满时,Node 将缓冲任何写入调用,并按您期望的顺序推送它们。您无需等待'drain'事件再次写入。

或者,您可以检查的返回值,write()然后通知正在写入 Stream 缓冲区已满的事物。这正是这样Stream#pipe()做的

所以通常,只需使用Stream#pipe(),所有的好东西都会为你处理好 :)

于 2012-04-07T20:05:38.453 回答