确保功能完成。使用Javascript

时间:2015-03-24 11:14:46

标签: javascript jquery node.js

我有以下功能。我读了几个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
}

2 个答案:

答案 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);
});

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