1

我有一个循环调用 API 并将结果编译到数组中。如何等到所有调用都完成后再恢复执行?我看到一堆关于如何等到一个电话完成的答案,但我不明白如何检查所有这些。如果我做一个等待直到“obj”长度正确的while循环,页面就会停止,直到调用完成,这不是我想要的。请帮忙?

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
4

2 回答 2

12

如果您使用 jQuery 的延迟,这很容易。有一种方法,$.when,它等待多个承诺完成然后运行回调。这就是你应该在这里使用的。

不要使用全局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]));
}

然后我们需要在所有这些都完成后挂钩回调:

$.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'];
});
于 2013-11-11T22:12:42.973 回答
1

getData将返回一个 promise,它是deferred的只读版本。然后,您可以使用$.when根据这些承诺的解析来执行代码

于 2013-11-11T22:13:32.630 回答