Node.js的可写流和流失事件

时间:2012-04-07 18:47:38

标签: node.js streaming

documentation for write()说:

  

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

并且drain事件的文档说明了:

  

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

这是什么意思?在我再次写作之前,我是否必须等待drain事件?我试图写的数据怎么了?丢了吗?当我在不等待drain事件的情况下拨打电话时会发生什么?

2 个答案:

答案 0 :(得分:6)

您可以在不关心安全返回值的情况下致电write()。当内核缓冲区已满时,Node将缓冲所有写入调用,并按预期顺序推送它们。 需要在再次写入之前等待'drain'事件。

或者,您可以检查write()的返回值,然后通知正在写入流的内容,即缓冲区已满。这正是Stream#pipe() does

通常情况下,只需使用Stream#pipe()即可为您解决所有好事:)

答案 1 :(得分:1)

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

  

那是什么意思?我是否必须等待排空事件之前   可以再写一次吗?

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

  

我尝试写入的数据发生了什么?丢了吗?

不,它不会丢失,它会以正确的顺序进行缓冲。

  

当我不等待消耗事件而调用write时会发生什么?

如果未正确处理耗用事件,则脚本将阻止事件循环,并最终耗尽内存限制,使应用程序崩溃。

我在另一个问题中给出了详细的解释:why does attempting to write large a large file cause js heap to run out of memory