Jquery 等待多个getJSON调用完成

Jquery 等待多个getJSON调用完成,jquery,ajax,getjson,Jquery,Ajax,Getjson,我有一个循环,可以调用API并将结果编译成数组。如何等待所有调用完成,直到恢复执行?我看到了一大堆关于如何等到一个电话打完的答案,但我不知道如何检查所有答案。如果我做一个while循环,直到'obj'的长度正确,页面就会暂停,直到调用完成,这不是我想要的。请帮忙 function getData(id) { var thisI = i; var url = "www.whatever.com?id=" + id; $.getJSON(url, function(data)

我有一个循环,可以调用API并将结果编译成数组。如何等待所有调用完成,直到恢复执行?我看到了一大堆关于如何等到一个电话打完的答案,但我不知道如何检查所有答案。如果我做一个while循环,直到'obj'的长度正确,页面就会暂停,直到调用完成,这不是我想要的。请帮忙

function getData(id) {
    var thisI = i;
    var url = "www.whatever.com?id=" + id;
    $.getJSON(url, function(data) {
        obj[thisI]=data;
    });
}

obj = [];
for (i=0; i < ids.length; i++) {
    getData(ids[i]);
}

console.log(obj)  //this works! I see all of the elements
document.getElementById("txt").innerHTML=obj[0]['field'];  //TypeError: obj[0] is undefined
函数getData(id){ var thisI=i; var url=“www.whather.com?id=“+id; $.getJSON(url、函数(数据){ obj[thisI]=数据; }); } obj=[]; 对于(i=0;i如果使用jQuery的延迟,这很容易。有一种方法,
$。当
完成多个承诺后,它会运行回调。这就是你应该在这里使用的

不要使用全局
obj
变量,只需使用AJAX调用的返回值即可

function getData(id) {
    var thisI = i;
    var url = "www.whatever.com?id=" + id;
    return $.getJSON(url);  // this returns a "promise"
}
因此,我们没有填充
obj
,而是返回承诺。然后在你的循环中,你收集它们

var AJAX = [];
for (i=0; i < ids.length; i++) {
    AJAX.push(getData(ids[i]));
}
var AJAX=[];
对于(i=0;i
然后,我们需要在所有回调完成后连接回调:

$.when.apply($, AJAX).done(function(){
    // This callback will be called with multiple arguments,
    // one for each AJAX call
    // Each argument is an array with the following structure: [data, statusText, jqXHR]

    // Let's map the arguments into an object, for ease of use
    var obj = [];
    for(var i = 0, len = arguments.length; i < len; i++){
        obj.push(arguments[i][0]);
    }

    document.getElementById("txt").innerHTML = obj[0]['field'];
});
$.when.apply($,AJAX).done(函数(){
//将使用多个参数调用此回调,
//每个AJAX调用一个
//每个参数都是具有以下结构的数组:[data,statusText,jqXHR]
//为了便于使用,让我们将参数映射到一个对象中
var-obj=[];
for(var i=0,len=arguments.length;i
如果使用jQuery的延迟,这很容易。有一种方法,
$。当
完成多个承诺后,它会运行回调。这就是你应该在这里使用的

不要使用全局
obj
变量,只需使用AJAX调用的返回值即可

function getData(id) {
    var thisI = i;
    var url = "www.whatever.com?id=" + id;
    return $.getJSON(url);  // this returns a "promise"
}
因此,我们没有填充
obj
,而是返回承诺。然后在你的循环中,你收集它们

var AJAX = [];
for (i=0; i < ids.length; i++) {
    AJAX.push(getData(ids[i]));
}
var AJAX=[];
对于(i=0;i
然后,我们需要在所有回调完成后连接回调:

$.when.apply($, AJAX).done(function(){
    // This callback will be called with multiple arguments,
    // one for each AJAX call
    // Each argument is an array with the following structure: [data, statusText, jqXHR]

    // Let's map the arguments into an object, for ease of use
    var obj = [];
    for(var i = 0, len = arguments.length; i < len; i++){
        obj.push(arguments[i][0]);
    }

    document.getElementById("txt").innerHTML = obj[0]['field'];
});
$.when.apply($,AJAX).done(函数(){
//将使用多个参数调用此回调,
//每个AJAX调用一个
//每个参数都是具有以下结构的数组:[data,statusText,jqXHR]
//为了便于使用,让我们将参数映射到一个对象中
var-obj=[];
for(var i=0,len=arguments.length;i
getData
将返回一个承诺,该承诺是一个协议的只读版本。然后,您可以根据这些承诺的解决方案执行代码,使用

getData
将返回一个承诺,该承诺是。然后,您可以使用console.log(obj)//根据这些承诺的解决方案执行代码!我看到了所有的元素
不,它没有。。。游戏机很可能在欺骗你。凯文的复制品,我想这就是正在发生的事情。如果我有许多需要几秒钟以上的调用,那么在它们全部完成之前,我不会在控制台中看到“obj”。
console.log(obj)//这很有效!我看到了所有的元素
不,它没有。。。游戏机很可能在欺骗你。凯文的复制品,我想这就是正在发生的事情。如果我有许多通话需要几秒钟以上,我不会在控制台中看到“obj”,直到他们全部完成。它工作!谢谢有没有办法回到全球范围?或者之后执行的所有操作都必须在这个代码块中吗?@stuppie:这是AJAX,所以是异步的。您可以设置一个全局变量,但我不建议这样做。您必须确保只有在设置了全局变量之后才访问它,这比使用回调要复杂得多:)它可以工作!谢谢有没有办法回到全球范围?或者之后执行的所有操作都必须在这个代码块中吗?@stuppie:这是AJAX,所以是异步的。您可以设置一个全局变量,但我不建议这样做。您必须确保只有在设置了全局变量之后才访问该变量,这比使用回调要复杂:)