Node.js等待.pipe()

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

我正在尝试读取大量文件并将其中的信息合并为一个。这是我得到的实现。我想将其重写为 .pipe(),但结果只是在每次迭代时覆盖文件。我正在寻求帮助。

    async joinSlices(path) {
        const wrs = new WriteStream('./bigJSON.json');
        const files = fs.readdirSync(path);
        for (let file of files) {
            console.log(file + ' start');
            await new Promise((res, rej) => {
                const rs = new ReadStream(path + file, 'utf-8');
                rs.on('data', (chunk) => { wrs.write(chunk); });
                rs.on('end', (data) => { console.log(file + ' end'); });
                rs.on('close', (data) => { res(); });
            });
        }
        wrs.destroy();
        console.log('write stream end');
    }

如果两个流都在其主体中声明,并且在记录末尾放置了一个承诺,则循环开始,但每次迭代都会发生覆盖。

node.js async-await stream for-await
1个回答
0
投票

Node.js 特定的 Stream API 使用起来有点麻烦。幸运的是,这些流也是标准化 Iteration_protocols 的实例(也在浏览器中实现),这意味着您可以按如下方式使用

for await of

import fs from 'fs'

const inDir = 'in/'
const outFile = fs.createWriteStream('./out.json')

outFile.write('[')
let first = true
for (const fileName of fs.readdirSync(inDir)) {
  if (first) {
    first = false
  } else {
    outFile.write(',')
  }

  const file = fs.createReadStream(inDir + fileName, { encoding: 'utf-8' })
  for await (const str of file) {
    outFile.write(str)
  }
}
outFile.write(']')

outFile.close()
© www.soinside.com 2019 - 2024. All rights reserved.