node.js - Node - 可读流 pipe() 在 for 循环中覆盖以前的流

标签 node.js stream pipe fs

我正在尝试使用以下代码将数据集合流式传输到多个文件:

for (var key in data) {
  // skip if collection length is 0
  if (data[key].length > 0) {
    // Use the key and jobId to open file for appending
    let filePath = folderPath + '/' + key + '_' + jobId + '.txt';

    // Using stream to append the data output to file, which should perform better when file gets big
    let rs = new Readable();
    let n = data[key].length;
    let i = 0;

    rs._read = function () {
      rs.push(data[key][i++]);

      if (i === n) {
        rs.push(null);
      }
    };

    rs.pipe(fs.createWriteStream(filePath, {flags: 'a', encoding: 'utf-8'}));

  }
}

但是,我最终让所有文件都填充了相同的数据,这是 data 对象中最后一个键的数组。似乎每个循环都覆盖了读取器流,并且在 for 循环完成之前,可写流的 pipe() 不会启动。这怎么可能?

最佳答案

所以您的代码可能无法正常工作的原因是因为 rs._read 方法是异步调用的,并且您的关键变量是函数范围的(因为 var 关键字)。

您创建的每个 rs 流都指向同一个变量,即键,在主循环结束时,每个回调都将具有相同的值。 当您将“var”更改为“let”时,那么在每次迭代中都会创建新的关键变量,这将解决您的问题(_read 函数将拥有自己的关键变量副本而不是共享副本)。

如果你改变它让它应该工作。

关于node.js - Node - 可读流 pipe() 在 for 循环中覆盖以前的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45988297/

相关文章:

node.js - 在 Socket.io 中重新连接并维护客户端 ID?

stream - Common Lisp 输出文件流 SBCL

c++ - 比使用流保存 boost 随机生成器状态更快的替代方法

node.js - 简单的 hello-world 应用程序在加载 800 个并发请求时速度很慢(130+ms)

javascript - 如何在 Node js 中使用 twitter 管理速率限制?

java - 将 EmailMessage 转换为 ByteArrayOutputStream

c - 读取时 C block 上的 UNIX 管道

c++ - 如何在 Windows 中访问继承的匿名管道 HANDLE,而不是 stdout、stderr 和 stdin?

c - 等待所有子进程退出

angularjs - 为什么 npm 试图在错误的目录中查找 package.json?