是的,console.log
首先发生是因为getJSON
是异步的。您的代码会启动它,但它会在后续代码运行后稍后完成。
要处理这个问题,您需要在getJSON
. 您上面的代码会记住它启动了多少次调用,并在继续之前等待那么多完成。
您还可以让您的populateDataRow
函数返回 的返回值getJSON
,保存这些对象,然后jQuery.when
在它们全部完成时使用它来获取通知。
这是一个示例:Live Copy | 直播源
var deferreds = [],
index;
for (index = 0; index < 4; ++index) {
deferreds.push($.getJSON("http://jsbin.com/agidot/1", function() {
display("One finished");
}));
}
$.when.apply($, deferreds).then(function() {
display("All finished")
});
function display(msg) {
$("<p>").html(String(msg)).appendTo(document.body);
}
请注意,当所有四个调用都完成时,我们只会看到“全部完成”。
打电话$.when
有点麻烦。出于某种原因,您不能只将一组Deferred
对象传递给它。所以我曾经Function#apply
调用它并将数组的每个条目作为离散参数传递。
我很惊讶$.when
不接受数组并有效地处理它,但我在这里看到其他答案也说要使用apply
:Here和Here。
如果您要经常使用数组,我想我可能会在我的标准 jQuery 扩展工具包中使用它:
(function($) {
$.whenAll = function(deferreds) {
return $.when.apply($, deferreds);
};
})(jQuery);
...然后上面的代码示例的结尾将是:
$.whenAll(deferreds).then(function() {
display("All finished")
});