确保函数已完成。Javascript

确保函数已完成。Javascript,javascript,jquery,node.js,Javascript,Jquery,Node.js,我有下面的功能。我读取了几个Json文件并对其进行了解析,希望将它们包含到一个数组中并返回该数组。问题是如何确保函数确实读取了硬盘上的5个文件?我已尝试检查变量I是否等于fileNameListLength-1,并检查函数是否以这种方式完成,但不起作用,for循环是在fs.readFile函数完成之前完成的。那么你将如何解决这个问题呢?。抱歉,问题可能重复 var fs = require('fs'); var urlToInfo = '/home/user/data'; function g

我有下面的功能。我读取了几个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
}
var fs=require('fs');
var urlToInfo='/home/user/data';
函数getRawData(){
var fileNameList=['file_1','file_2','file_3','file_4','file_5'];
var fileNameListLength=fileNameList.length;
var rawDataArray=新数组();
对于(var i=0;i
您应该检查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
})

您可以尝试使用
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);
});

这将串联执行函数并填充数组。当调用所有迭代器函数时,将执行回调函数。

最简单的解决方案是同步执行,例如,
readFileSync