我的目标是从两个文件中读取数据并比较数据。我的输入文件是result3.json和result4.json。这些文件中的数据以逗号分隔。
result3.json
[
"temp1.txt",
"temp2.txt",
]
节点:
function readFromFile(file) {
var fileNames = [];
//setTimeout(function() {
fs.readFile(file,function(err, data){
if (err) {
return console.log(err);
}
var temp = JSON.parse(data.toString().split(","));
// console.log(temp.length);
for (let index = 0; index < temp.length; index++) {
//console.log(temp[index]);
fileNames.push(temp[index]);
//console.log(fileNames[index]);
}
Done(); // to block the async call
});
//},3000);
//console.log(fileNames.length);
return fileNames;
}
var baseListOfFiles = readFromFile('./output/result3.json'); // Assume this is the base file
var currentListOfFiles = readFromFile('./output/result4.json'); // Assume this is the current file
function Done(){
//console.log('Out baseListOfFiles + ' + baseListOfFiles.length);
for (let index = 0; index < baseListOfFiles.length; index++) {
console.log("[baseListOfFiles] " + baseListOfFiles[index]);
}
//console.log('Out currentListOfFiles+ ' + currentListOfFiles.length);
for (let index = 0; index < currentListOfFiles.length; index++) {
console.log("[currentListOfFiles] " + currentListOfFiles[index]);
}
}
以上是我的代码。它似乎是异步调用,因此它总是返回0个文件名。 有什么办法可以控制它?
答案 0 :(得分:3)
以下是使用Promises的示例代码:
const fs = require('fs');
function readFromFile(file) {
return new Promise((resolve, reject) => {
fs.readFile(file, function (err, data) {
if (err) {
console.log(err);
reject(err);
}
else {
resolve(JSON.parse(data));
}
});
});
}
const promises = [
readFromFile('./output/result3.json'),
readFromFile('./output/result4.json')
];
Promise.all(promises).then(result => {
console.log(result);
baseListOfFiles = result[0];
currentListOfFiles = result[1];
// do more stuff
});
首先,构建一个数组promises
;每个Promise都会读取文件,然后调用resolve
并返回结果。
该数组传递给Promise.all()
,then
调用回调,以相同顺序传递结果数组。
答案 1 :(得分:2)
您是对的,readFile
是异步的。您正在寻找的是readFileSync
:https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options
可以做到:
const data = fs.readFileSync(file);
//do something with data
如果愿意,可以通过多种方式“承诺” readFile
,这里讨论了这些选项:Using filesystem in node.js with async / await