【发布时间】:2015-04-04 18:08:39
【问题描述】:
Node.js 流触发end 和finish 事件。两者有什么区别?
【问题讨论】:
Node.js 流触发end 和finish 事件。两者有什么区别?
【问题讨论】:
end 和 finish 是相同的事件,但在不同类型的 Streams 上。
stream.Readable 仅触发 end 并且从不触发 finish
stream.Writable 仅触发 finish 并且从不触发 end
来源:https://nodejs.org/dist/latest-v5.x/docs/api/stream.html
为什么同一事件的命名不同?
我能想到的唯一原因是因为双工流 (stream.Duplex),它实现了 stream.Readable 和 stream.Writable 接口 (https://nodejs.org/dist/latest-v5.x/docs/api/stream.html#stream_class_stream_duplex) 同时是可读和可写的流。要区分流上的读取结束和写入结束,您必须触发不同的事件。所以,对于双工流,end 是读取结束,finish 是写入结束。
【讨论】:
Transform 流同时具有end 和finish 事件。事实上它扩展了Duplex。
end 的数据与 finished 的工作是有道理的。一个可写对象可能已经接收到它要获取的所有数据,例如它从上游收到end,但仍在工作。 (我不确定,但猜测finished 总是在end 之后进行转换?)