我有以下功能。我读了几个Json文件并解析它们并希望将它们包含在一个数组中并返回该数组。问题是如何确保该函数真正读取了硬盘上的5个文件?我已经尝试检查变量i
是否等于fileNameListLength-1
并检查函数是否已完成,但它没有工作,for循环在fs.readFile
函数完成之前完成。那你怎么解决这个问题?很抱歉可能有问题重复。
var fs = require('fs');
var urlToInfo = '/home/user/data';
function getRawData() {
var fileNameList = ['file_1', 'file_2', 'file_3', 'file_4', 'file_5'];
var fileNameListLength = fileNameList.length;
var rawDataArray = new Array();
for (var i = 0; i < fileNameListLength; i++) {
var url = urlToInfo + "/Data/" + fileNameList[i] + ".json";
fs.readFile(url, 'utf8', function (err, data) {
if (err) {
return console.log(err);
}
try {
var portalData = JSON.parse(data);
rawDataArray[fileNameList[i]] = portalData;
} catch (e) {
// Error parsing JSON data
console.log("Error Parsing Json data.");
console.log(e);
}
});
}
//Make sure that all files have been read and that the rawDataArray contains all info
//return rawDataArray
}
答案 0 :(得分:0)
你应该检查readFile cb中的条件,这应该很容易。
但我建议你可以尝试一下。
var fsp = require('fs-promise');
var files = ['foo1', 'foo2'];
// weird, files.map(fsp.readFile) does not work.
Promise.all(files.map(function (foo) {
return fsp.readFile(foo);
})).then(function (results) {
// process data
}, function (err) {
// error processing
})
答案 1 :(得分:0)
您可以尝试使用async
库并使用eachSeries
功能。
var fs = require('fs');
var async = require('async');
var urlToInfo = '/home/user/data';
var rawArray = [];
async.eachSeries(fileNameList, function(fileName,callback){
var url = urlToInfo + "/Data/" + fileNameList[i] + ".json";
fs.readFile(url, 'utf8', function (err, data) {
if (err) {
return console.log(err);
}
try {
var portalData = JSON.parse(data);
rawArray.push(portalData);
} catch (e) {
// Error parsing JSON data
console.log("Error Parsing Json data.");
console.log(e);
}
});
}, function(err){
console.log('the reading of all files finished');
console.log('array',rawArray);
});
这将在串行执行函数并在调用所有迭代器函数时填充数组,将执行回调函数。