Javascript 如何通过管道将一个可读流传输到另一个可读流?
我正在做“流冒险”中的练习,我对Javascript 如何通过管道将一个可读流传输到另一个可读流?,javascript,node.js,Javascript,Node.js,我正在做“流冒险”中的练习,我对流组合器模块非常不确定 具体来说,它说: 流组合器模块从流列表创建管道 流,返回将第一个流公开为 可写端和最后一个流作为可读端,如 双工器模块,但中间有任意数量的流。 与双工器模块不同,每个流通过管道传输到下一个流。对于 例如: var combine = require('stream-combiner'); var stream = combine(a, b, c, d); 将在内部执行a.pipe(b).pipe(c).pipe(d)但是流 由combin
流组合器
模块非常不确定
具体来说,它说:
流组合器
模块从流列表创建管道
流,返回将第一个流公开为
可写端和最后一个流作为可读端,如
双工器
模块,但中间有任意数量的流。
与双工器模块不同,每个流通过管道传输到下一个流。对于
例如:
var combine = require('stream-combiner');
var stream = combine(a, b, c, d);
将在内部执行a.pipe(b).pipe(c).pipe(d)
但是流
由combine()
返回,其可写端连接到a
及其
可读侧连接到d
现在正如它所说,“它的可写端连接到a
,可读端连接到d
”,我们可以使用上面的流,如下所示:
someReadableStream.pipe(stream).pipe(someWritableStream)
但上述情况难道不会变成:
someReadableStream.pipe(a).pipe(b).pipe(c).pipe(d).pipe(someWritableStream)
我的问题是,一个可读流如何通过管道传输到另一个可读流。最后,管道传输到可写流的结果如何再次管道传输到可写流。下面是一个文本示例,希望能够澄清关于流的规则,以便流合并器执行有用的操作:
var rw = combine(r_or_rw, rw1, rw2, rw3, ...rwN, w_or_rw)
因此,第一个流至少需要可读,内部流都需要读/写,最后一个流至少需要可写。返回的新流是读/写的。当您写入返回的流时,它会通过管道向下发送新数据,当您读取时,它会从管道的末端向您提供数据。您正确地认为它与可读的.pipe(a).pipe(b).pipe(c).pipe(d).pipe(可写)
相同,
combiner的优点是不能从函数返回a.pipe(b).pipe(c).pipe(d)
,因此必须始终手动连接它们。使用combiner,您可以从其他流中创建流,然后将其整理成函数或模块
不过,要使其工作,a、b、c、d都必须是可读可写的转换流。请查看直通流。这可能是你所需要的。@MattHarrison我想你误解了我,我的疑问是为什么上面的方法有效?:)
a
和d
必须是可读写的。所以我需要确保这一点吗?或者它是自动完成的。因为流组合器
上的文档就像“它是否存在”一样,您需要写入流的可读内容,因此您的第二个流需要是可写的。我了解了组合的概念,但我不理解为什么您可以将数据写入流,由于新流的第一部分是可读流,因此如果stream1
是只读的,您将无法写入返回流,但如果是读/写的,写入返回流将写入stream1并流经管道。根据最后一个流是只写流还是读/写流,结尾处的情况类似。我认为stream combiner API为您提供了一个r/w流以实现多功能性,但这取决于您知道哪些组合将起作用,哪些组合将不起作用。这很有意义!他们的文档真的很糟糕,请发送拉取请求!这是一个很小的模块。开源!