有人可以解释发生了什么在我的JavaScript函数


Can somebody explain whats happening in my JavaScript function?

所以我有一些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中生成带有循环的事件处理程序?对于周围的工作。