2015-06-30 92 views
0

我的网页有一个表格,每行有一个“+”按钮,以便出现一个小表格。迷你表包含来自超慢数据库的数据,因此我通过ajax请求发送数据。我的问题根源于某种情况。假设你按下了一个加号按钮,导致一个AJAX请求,并在等待你按另一个加号按钮。第二个Ajax请求导致第一个请求不再回来。换句话说,最新的请求会覆盖所有以前的待处理请求。任何想法为什么这可能会发生?我觉得这可能只是当你不使用jQuery来处理AJAX时发生的事情,但我不确定,而且我也找不到那种情况。我在下面附加我的代码。任何帮助表示赞赏!并发AJAX请求无效。最新的请求会覆盖以前的请求

function fetchSINamesForVariantAJAX(latestBuild, variantToExpand){ 
if (latestBuild == "") { 
    //document.getElementById(subTableId).innerHTML = ""; 
    return; 
} 
else { 
    if (window.XMLHttpRequest) { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp = new XMLHttpRequest(); 
    } else { 
     // code for IE6, IE5 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
      spinner.stop(); 
      var variantRow = variantToExpand + "Row"; 
      if (document.getElementById(variantRow).rows.length == 1){ 
       var json = JSON.parse(xmlhttp.responseText); 
       var SINames = json['SIs']; 
       var locations = json['locations']; 
       var SIBuilds = json['SIBuilds']; 
       for (var i = 0; i < SINames.length ; i++){ 
        var row = document.getElementById(variantRow).insertRow(-1); 
        var cell = row.insertCell(-1); 
        var SILinkURL = "exampleWebsite.com/name.php?names=" + SINames[i]; 
        cell.innerHTML = "<a href=\"" + SILinkURL + "\">" + SINames[i] + "</a>"; 

        cell = row.insertCell(-1); 
        var fullLocation = locations[i] + "\\" + SIBuilds[i]; 
        cell.innerHTML = "<a href=\"" + fullLocation + "\">" + fullLocation + "</a>"; 

        cell = row.insertCell(-1); 
        cell.innerHTML = ""; 
       } 
      } 
     } 
    } 
    //create the GET message to be sent using AJAX window 
    var stateToSend = "SITableGeneratorFromVariant.php?"; 
    stateToSend += "latestBuild=" + latestBuild;  
    xmlhttp.open("GET", stateToSend, true); 
    xmlhttp.send(); 
} 

}

+0

你能对你所看到的行为更具体些? AJAX请求不会“取消”另一个请求。在浏览器的调试工具中,这两个请求会发生什么?他们对服务器的回应是什么?当你调试这段代码时,当每一个返回并调用'onreadystatechange'时会发生什么? – David

+0

我认为这是因为您的var xmlhttp请求没有在函数中作用域,所以每次调用该函数时,xmlhttp请求都是全局变量,您将覆盖它。尝试在函数顶部声明var xmlhttp –

+0

我接受了您的建议并查看了调试信息。我注意到我从未将xmlhttp声明为var,因此我添加了“var xmlhttp;”行在功能的最顶端,并解决了问题。感谢您的帮助! – user3662531

回答

1

我想原因是,你每一个新的AJAX调用一事无成尝试声明它的函数内部的时间覆盖您的XMLHTTP变量,一个新问题:

if (window.XMLHttpRequest) { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     var xmlhttp = new XMLHttpRequest(); 
    } else { 
     // code for IE6, IE5 
     var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
+0

谢谢!这就是诀窍! – user3662531