我有一组文件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)
答案 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)
})