函数读取任何可读流的内容

问题描述 投票:0回答:1

我想编写一个 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 python file stream
1个回答
4
投票

在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 函数,并将结果记录到控制台。

© www.soinside.com 2019 - 2024. All rights reserved.