并行读取多个文件并相应地将数据写入新文件node.js

Reading multiple files in parallel and writing the data in new files accordingly node.js

我正在尝试处理同时从文件夹中读取多个文件并将新文件写入不同文件夹的异步操作。我阅读的文件是成对的。一个文件是数据模板,另一个文件是关于数据的。根据模板,我们处理来自相关数据文件的数据。我从这两个文件中获得的所有信息都被插入到一个对象中,我需要将其写入 JSON 到一个新文件中。如果只有一对这些文件(1 个模板和 1 个数据),下面的代码将完美运行:

for(var i = 0; i < folderFiles.length; i++)
{
    var objectToWrite = new objectToWrite();
    var templatefileName = folderFiles[i].toString();
    //Reading the Template File
    fs.readFile(baseTemplate_dir + folderFiles[i],{ encoding: "utf8"},function(err, data)
    {
      if(err) throw err;
      //Here I'm manipulating template data

      //Now I want to read to data according to template read above
      fs.readFile(baseData_dir + folderFiles[i],{ encoding: "utf8"},function(err, data)
      {
        if(err) throw err;
        //Here I'm manipulating the data
        //Once I've got the template data and the data into my object objectToWrite, I'm writing it in json in a file
        fs.writeFile(baseOut_dir + folderFiles[i], JSON.stringify(objectToWrite ),{ encoding: 'utf8' }, function (err) 
        {
            if(err) throw err;
            console.log("File written and saved !");
        }
      }
    }
}

因为我有 4 个文件,所以两个模板文件和两个相关数据文件,它崩溃了。所以我相信我的回调有问题......也许有人可以帮我弄清楚!提前致谢!

它发生是因为 readFile 是异步的,所以 for 循环不等待它被执行并继续下一次迭代,它最终非常快地完成所有迭代,所以到执行 readFile 回调时,folderFiles[i] 将包含最后一个文件夹的名称 => 所有回调将仅操作最后一个文件夹名称。解决方案是将所有这些东西移到循环外的单独函数中,这样闭包就会派上用场。

function combineFiles(objectToWrite, templatefileName) {
  //Reading the Template File
  fs.readFile(baseTemplate_dir + templatefileName,{ encoding: "utf8"},function(err, data)
  {
    if(err) throw err;
    //Here I'm manipulating template data

    //Now I want to read to data according to template read above
    fs.readFile(baseData_dir + templatefileName,{ encoding: "utf8"},function(err, data)
    {
      if(err) throw err;
      //Here I'm manipulating the data
      //Once I've got the template data and the data into my object objectToWrite, I'm writing it in json in a file
      fs.writeFile(baseOut_dir + templatefileName, JSON.stringify(objectToWrite ),{ encoding: 'utf8' }, function (err) 
      {
          if(err) throw err;
          console.log("File written and saved !");
      }
    }
  }
}

for(var i = 0; i < folderFiles.length; i++)
{
    var objectToWrite = new objectToWrite();
    var templatefileName = folderFiles[i].toString();

    combineFiles(objectToWrite, templatefileName);
}