所以我有一些ajax调用发生。第一个getJson返回一个json对象,我命名为"tables",它的结构为tables['tables'],列出了数据库中表的名称。Key1表示每个表名。所以我特意循环遍历每个表。我正在测试的东西出来,所以当表的名称是具体的"接口"(请参阅if语句),然后我想执行另一个ajax请求,从表本身检索数据。
这很奇怪,因为console.log(key1)确实吐出了如果key1 == " interfaces ",然而,我的第二个console.log(key1)没有吐出接口。它在"vlan"上吐出,这是我数据库中的最后一个表。
尽管如此,我的条目数组还是填充了来自接口的正确数据。
我不明白为什么一旦我进入我的第二个getJson语句,key1的val改变,特别是当这个函数甚至不应该访问时,key1不等于"接口"。
$.getJSON( "/ryan/nonEmber/getTables.php", function( data ) {
tables = data;
for (var key1 in tables['tables']) {
if (tables['tables'].hasOwnProperty(key1)) {
console.log(key1 + " -> " + tables['tables'][key1]);
if(key1 == 'Interfaces'){
console.log(key1);
$.getJSON("/ryan/nonEmber/getJson.php?table=" + key1, function( data2 ){
var items = [];
$.each(data2.post, function(key, val){
items.push(val);
});
console.log(key1);
for(i = 0; i < items.length; i++){
var myString = '<tr id = "visibleRow">';
for(j = 0; j < tables['tables'][key1].length; j++){
myString = myString + '<td id = "visibleDef">' + items[i][tables['tables'][key1][j]] +'</td>';
}
myString = myString + '</tr>';
Interfaces.push(myString);
}
});
}
}
}
});
你可能会发现我的问题出在ajax上。这可能是,但我写的ajax函数依赖于其他ajax函数在过去,他们已经正确地工作。实际上,我在这里展示的这个函数取代了另一个包含3个ajax调用的函数。我只是想缩短它。
谁能解释一下这里发生了什么?Ajax是异步的。
你的循环触发Ajax请求。
传递给getJSON
的函数是事件处理程序,当收到HTTP响应时运行。
在重复调用getJSON
的循环完成之前,没有接收到任何响应,此时值是最后一个。
参见如何在Javascript中生成带有循环的事件处理程序?对于周围的工作。