Node流中的end事件和finish事件有什么区别?

90

Node.js流触发endfinish事件。两者的区别是什么?

1个回答

160

endfinish是相同的事件,但出现在不同类型的流中。

  • stream.Readable仅触发end事件,而从不触发finish事件
  • stream.Writable仅触发finish事件,而从不触发end事件

来源:https://nodejs.org/dist/latest-v5.x/docs/api/stream.html

为什么相同事件名称不同?

我唯一能想到的理由是双工流(stream.Duplex)的存在,它实现了stream.Readablestream.Writable接口(https://nodejs.org/dist/latest-v5.x/docs/api/stream.html#stream_class_stream_duplex),即同时可读可写的流。为了区分在流上的读取结束与写入结束,必须触发不同的事件。因此,对于双工流,end表示读取结束,finish表示写入结束。


2
同时,Transform 流具有 endfinish 事件。实际上它是 Duplex 的扩展。 - Rocco Musolino
1
@AlexanderMills,文档(https://nodejs.org/dist/latest-v12.x/docs/api/stream.html)上说了什么?此外,您可以尝试使用简单的测试用例,例如fs.ReadStream和fs.WriteStream - https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_class_fs_readstream。欢迎贡献您的发现。 - tiblu
3
“数据结束”与“工作完成”是有区别的。一个可写入对象可能已经接收了它将要接收的所有数据,例如它从上游接收到了一个“end”信号,但仍在进行处理。(我不确定,但猜测对于转换器而言,“finished”总是在“end”之后发生?) - Craig Hicks
1
@tiblu,我从文档中引用这个声明,因为这意味着它们两者都会触发(即使是可写流)。相比之下,你的答案说不论流类型,要么触发 finish ,要么触发 end,这才是你回答的实际重点,而我在文档中找不到这一点。 - fishbone
1
@fishbone 如果您参考的是 https://nodejs.org/dist/latest-v5.x/docs/api/stream.html#stream_events_finish_and_end ,其中提到: “在调用 stream._transform() 处理所有块并调用 stream.end() 后,将触发 finish 事件;在输出所有数据(即在调用 stream._flush() 回调之后)后,将触发 end 事件。” 这是关于转换流的内容。 如果您所指的不是这个,请添加精确的引用(链接)。 如果您仍然认为两者都适用于可写流,请编写测试代码以证明。请分享代码。 - tiblu
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接