我想编写一个 JavaScript 函数,它接受任何可读流(具有
read()
方法的对象,包括文件系统和内存流)并返回其内容。
在 Python 中就这么简单:
>>> def f(stream):
... return stream.read()
...
>>> f(open('foo.json')) # file-system stream
'{"host": "localhost", "port": 8000}\n'
>>> import io
>>> f(io.StringIO('{"host": "localhost", "port": 8000}\n')) # in-memory stream
'{"host": "localhost", "port": 8000}\n'
JavaScript 中的等效代码(函数以及文件系统和内存流)是什么?
在JavaScript中,可以使用流对象的可读事件从流中读取数据。这是一个示例函数,它接受任何可读流对象并返回其内容:
function readStream(stream) {
return new Promise((resolve, reject) => {
let data = '';
stream.on('readable', () => {
let chunk;
while (chunk = stream.read()) {
data += chunk;
}
});
stream.on('end', () => {
resolve(data);
});
stream.on('error', (err) => {
reject(err);
});
});
}
该函数返回一个承诺,该承诺在完成读取后使用流的内容进行解析。 readable 事件用于从流中读取数据并将其连接成一个字符串。 end 事件用于使用最终数据解决 promise,而 error 事件用于在发生错误时拒绝 promise。
要将此函数与文件系统流一起使用,您可以从 fs 模块传递 createReadStream 函数的结果:
const fs = require('fs');
const fileStream = fs.createReadStream('foo.json');
readStream(fileStream)
.then(data => console.log(data))
.catch(err => console.error(err));
要将此函数与内存流一起使用,您可以从流模块创建一个新的可读流:
const { Readable } = require('stream');
const inMemoryStream = new Readable({
read() {
this.push('{"host": "localhost", "port": 8000}\n');
this.push(null);
}
});
readStream(inMemoryStream)
.then(data => console.log(data))
.catch(err => console.error(err));
在本例中,创建了一个新的可读流,使用自定义读取方法将数据推送到流中。 push(null) 调用表示数据结束。然后使用内存中的流调用 readStream 函数,并将结果记录到控制台。