我正在尝试处理异步操作,该操作同时从文件夹中读取多个文件,并在另一个文件夹中写入新文件。我读的文件是成对的。一个文件是数据模板,另一个是数据。根据模板,我们处理来自相关数据文件的数据。我从这两个文件中获得的所有信息都插入到我需要用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个文件,因此有两个模板文件和两个相关数据文件,因此崩溃了。所以我相信我的回调有问题......也许有人可以帮我搞清楚!提前谢谢!
答案 0 :(得分:1)
这种情况正在发生,因为readFile
是异步的,所以for
循环不会等待它执行并继续下一次迭代,它最终会很快完成所有迭代,所以时间readFile
回调已执行,folderFiles[i]
将包含最后一个文件夹的名称=&gt;所有回调只会运行最后一个文件夹名称。解决方案是将所有这些东西移到循环中的单独函数中,因此闭包会派上用场。
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);
}