Javascript 如何等待多个fs.readFile调用?

Javascript 如何等待多个fs.readFile调用?,javascript,node.js,Javascript,Node.js,我的目标是从两个文件中读取数据并比较数据。我的输入文件是result3.json和result4.json。这些文件中的数据是分开的 result3.json [ "temp1.txt", "temp2.txt", ] 节点: 函数readFromFile(文件){ var文件名=[]; //setTimeout(函数(){ fs.readFile(文件、函数(错误、数据){ 如果(错误){ 返回console.log(err); } var temp=JSON.parse(data.

我的目标是从两个文件中读取数据并比较数据。我的输入文件是result3.json和result4.json。这些文件中的数据是分开的

result3.json

[
  "temp1.txt",
  "temp2.txt",
]
节点:

函数readFromFile(文件){
var文件名=[];
//setTimeout(函数(){
fs.readFile(文件、函数(错误、数据){
如果(错误){
返回console.log(err);
}
var temp=JSON.parse(data.toString().split(“,”);
//控制台日志(温度长度);
对于(让索引=0;索引
上面是我的代码。它似乎是异步调用,所以它总是返回0个文件名。
有什么方法可以控制它吗?

没错,
readFile
是异步的。您要查找的是
readFileSync

有了它,我们可以做:

const data = fs.readFileSync(file);

//do something with data

有几种方法可以“promisify”
readFile
,如果您愿意,这里将讨论这些选项:

下面是使用Promissions的示例代码:

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
;每个承诺读取文件,然后调用
resolve
并给出结果。

此数组被传递给
Promise.all()
,然后
调用回调,以相同的顺序传递结果数组。

有几种方法可以等待多个异步调用完成。请参见此处:另外,如果这些文件包含JSON,则无需使用
toString()
split()
或任何此类文件。感谢您的指导。我试试这个way@PraveerKumar使用将
fs.readFile()
包装成承诺,然后使用async并等待(如果您使用的是>=NodeJS v8)。另一个答案应该是首选答案。JS本质上是异步的,强制同步不是一个好主意。假设读取两个文件都需要1分钟,您不希望等待1+1=2分钟,而是在两个文件并行完成后才等待1分钟
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
});