从文件加载的JSON对象数组

时间:2014-05-09 18:40:47

标签: javascript json

我有一组文件a.json,b.json,c.json等,我想将其中包含的数据加载到JavaScript中的单个数据结构中。但是,以下代码的最后一行总是返回0而不是我期望的3。我做错了什么?

    files = ["a", "b", "c"];
    var dataset = [];

    function getObject(file) {
        return $.getJSON(file).then(function (data) {
            return data;
        });
    }


    for (i = 0; i < files.length; i++) {
        getObject(files[i] + ".json").done(function (data) {
            dataset.push(data);
        });
    }

    alert(dataset.length)

2 个答案:

答案 0 :(得分:1)

您可以使用done方法处理它:

var doneCount = 0;
for (i = 0; i < files.length; i++) {
    getObject(files[i] + ".json").done(function (data) {
        dataset.push(data);
        if ( ++doneCount  == files.length ){
           alert(dataset.length);
        }
    });

}

答案 1 :(得分:1)

首先,如果在调用alert后立即运行$.ajax,则数据不可用且您的变量尚未设置。您必须等到调用完成后(在$.ajax的方法调用返回后很长时间since it's asynchronous)。 How do I return the response from an asynchronous call?

其次,要同步请求,您可以使用$.when,以便在所有请求解决后通知您。 Wait until all jQuery Ajax requests are done?

var files = ["a", "b", "c"];
var dataset = [];
var requests = [];

for (i = 0; i < files.length; i++) {
    requests.push($.getJSON(files[i] + ".json") );
}

// $.when may not take the requests as an array, in that case use
// $.when.apply($, requests).done();
$.when(requests).done(function() {
    for (var i=0; i < arguments.length; i++) {
        dataset.push(arguments[i]);
    }
    alert('All three received, dataset length is ' + dataset.length)
})