我嵌套了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);
}
我在哪里兑现承诺?这是解决这个问题的最佳方法吗?
答案 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
。