2015-06-30 3 views
0

На моей веб-странице есть таблица, в которой каждая строка имеет кнопку «+», чтобы появилась мини-таблица. В мини-таблице представлены данные из супер медленной базы данных, поэтому я получаю данные через аякс-запросы. Моя проблема уходит корнями в определенную ситуацию. Предположим, вы нажали кнопку «плюс», вызвав запрос 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, и вы переписываете его. Попробуйте объявить var xmlhttp в верхней части вашей функции –

+0

Я принял ваш совет и заглянул в отладку. Я заметил, что я никогда не объявлял xmlhttp как var, поэтому добавил строку «var xmlhttp;» в самой верхней части функции и которая фиксировала проблему. Спасибо за помощь! – user3662531

ответ

1

Я думаю, что причина в том, что вы переписываете XmlHttp переменную с новым каждый раз, когда новый AJAX вызов будет сделано попытаться объявить ее внутри функции:

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

Смежные вопросы