jQuery - 完成所有Ajax请求后执行某些操作

时间:2016-10-18 10:33:32

标签: javascript jquery json

我嵌套了for - 循环和对外部URL的Ajax调用。我想使用承诺,但我不知道把它们放在哪里。在输出$.getJSON之前,我需要确保所有problemHost - 请求都已完成。

for (var i = 0; i < hosts.length; i++) {
  var obj = hosts[i];

   for (var key in obj) {
    var attrName = key;
    var attrValue = obj[key];
    host = obj[key];
    console.log(host);

    $.getJSON('http://myURL/get/', {
        uid: host + "." + domain,
        last: 1
    }, function(data) {
        json = data;
        for (var i = 0; i < json.length; i++) {
            var obj = json[i];
            for (var key in obj) {
                var attrName = key;
                var attrValue = obj[key];
                if (key.includes("JFSFILE_")) {
                    var newkey = key.replace("JFSFILE_", "");
                    console.log(newkey + " " + obj[key]);
                    if (parseFloat(obj[key]) > 20) {
                        if (typeof problemHost[host] == 'undefined') {
                            problemHost[host] = {};
                        }
                        problemHost[host][newkey] = obj[key];

                    }
                }
            }
        }
    });

}
}

所有 Ajax调用完成之前,不应执行此操作:

if (problemHost.length > 0) {
    console.log(problemHost);
}

我在哪里兑现承诺?这是解决这个问题的最佳方法吗?

1 个答案:

答案 0 :(得分:0)

您可以只计算已经提出的请求数量,因为您知道总共需要做多少,所以您可以这样做:

var reqs_done = 0;
for(var i = 0; i < hosts.length; i++)
{
    // ...
    $.getJSON(...).done(function()
    {
        reqs_done++;
        if(reqs_done == hosts.length)
        {
            // Code when all requests are done ...
        }
    }
}

请注意,您还应该在高效的环境中检查.fail