jQuery -当所有Ajax请求完成时执行一些操作

jQuery - Do something when all Ajax requests are done

本文关键字:执行 完成时 操作 请求 Ajax jQuery      更新时间:2023-09-26

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

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);
}

我把承诺放在哪里?这是解决问题的最好方法吗?

您可以计算已经发出了多少请求,并且由于您知道总共需要做多少,您可以这样做:

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