如何在批量getJSON指令完成时触发某些操作?

时间:2013-05-09 16:35:57

标签: jquery asynchronous getjson

以下是我的一些代码:

for (var i = 0; i < recordList.length; i++) {
  var recordID = recordList[i];
  populateDataRow(i, recordID, columns) 
};
console.log("done");

此处populateDataRow是一个使用$.getJSON的函数 问题是(至少在谷歌浏览器中),console.log语句在populateDataRow周期完成之前很久就被触发

2 个答案:

答案 0 :(得分:4)

是的,console.log首先发生,因为getJSON 异步。您的代码启动,但在后续代码运行后,它将在稍后完成。

要处理这个问题,您需要在getJSON上使用“完成”回调。上面的代码会记住它启动了多少次调用,并在继续之前等待那么多次完成。

您还可以让populateDataRow函数返回getJSON的返回值,保存这些对象,然后使用jQuery.when在完成所有内容后收到通知。< / p>

以下是一个例子:Live Copy | Live Source

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不接受数组并有效处理,但我在此处看到其他答案也说要使用applyHereHere

如果您打算多次使用数组,我想我可能会在我的jQuery扩展标准工具包中使用它:

(function($) {
    $.whenAll = function(deferreds) {
        return $.when.apply($, deferreds);
    };
})(jQuery);

...然后上面代码示例的结尾将是:

$.whenAll(deferreds).then(function() {
  display("All finished")
});

答案 1 :(得分:0)

$.getJSON是jQuery的$.ajax() - 函数的简写函数。 XHR(或AJAX) - 调用是异步的,你的其他代码将被进一步执行,你需要提供一个在AJAX调用完成时执行的回调函数。

来自API(http://api.jquery.com/jQuery.getJSON/

$.getJSON('ajax/test.json', function(data) {

});

这里,function(data){}是回调函数,作为getJSON的参数提供。 如果要对返回的数据执行某些操作,则需要在此函数中执行此操作,或者在执行此函数后执行此操作。