并发AJAX请求不起作用。最新请求会覆盖先前的请求

时间:2015-06-30 17:03:34

标签: javascript php jquery ajax web

我的网页上有一个表格,每行都有一个“+”按钮,以便显示一个迷你表格。迷你表包含来自超级慢速数据库的数据,因此我通过ajax请求获取数据。我的问题根源于某种情况。假设您按下加号按钮导致AJAX请求,并在等待时按另一个加号按钮。第二个ajax请求导致第一个请求永远不会返回。换句话说,最新的请求会覆盖所有先前的待处理请求。知道为什么会这样吗?我觉得这可能只是当你不使用jQuery来处理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();
}

}

1 个答案:

答案 0 :(得分: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");
    }