как ждать 1 ajax-вызова, чтобы завершить повторный ajax-вызов в цикле? - PullRequest
2 голосов
/ 25 августа 2011

Я вызываю функцию внутри цикла, которая выполняет AJAX-вызов. Мне нужно подождать, пока закончится 1 вызов ajax, прежде чем сделать другой вызов. Код похож на

function chkAll(field, markr) {
    var string = "document.forms[0].pCheckBox" + markr + ".checked";
    var temp = eval(string);
    if (temp) {
        if (field.length > 1) {
            for (i = 0; i < field.length; i++) {
                field[i].checked = true;
                decide(field[i].id, field[i].value);
            }
        }
        else {
            field.checked = true;
            decide(field.id, field.value);
        }
    }
}

функция, выполняющая вызов ajax, выглядит следующим образом:

function decide(code, dataString) {
    if (document.getElementById(code).checked) {
        var url = "../PRODUCT/PCProcess_Ajax.jsp?CIMS_CSRFTOKEN=" + getTokenFromSessionId();
        if (window.ActiveXObject) {
            httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        } else if (window.XMLHttpRequest) {
            httpRequest = new XMLHttpRequest();
        }
        httpRequest.open("POST", url, true);
        httpRequest.onreadystatechange = processRequest;
        httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        varparameters = "pScreenId=ClmReports&pEventCode=NFACREATE&pDataString=" + 
            dataString + "&pSelectName=" + code;
        httpRequest.send(parameters);
    } else {
        var url = "../PRODUCT/PCProcess_Ajax.jsp?CIMS_CSRFTOKEN=" + getTokenFromSessionId();
        if (window.ActiveXObject) {
            httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        }
        else if (window.XMLHttpRequest) {
            httpRequest = new XMLHttpRequest();
        }
        httpRequest.open("POST", url, true);
        httpRequest.onreadystatechange = processRequest;
        httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        var parameters = "pScreenId=ClmReports&pEventCode=NFADELETE&pDataString=" + dataString;
        httpRequest.send(parameters);
    }
}

в processRequest() Я просто храню httpRequest.responseText и использую его. Я хочу убедиться, что один decide() вызывается после того, как закончился предыдущий 1.

любой вид в этом ??

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Используйте систему очередей.Где-нибудь есть массив, в который вы добавляете структуру URL / данных (в основном очередь заданий), а также переменную, которая помечает, когда запрос ajax является ожидающим.После того, как вы поместите свои todo-данные в массив, вызовите функцию (doNextAjax ()?), Которая проверяет состояние флага и инициирует запрос ajax, если нет невыполненной работы.Если есть незавершенное задание, функция просто возвращает.

В обработчике успеха вызова ajax просто вызовите эту функцию doNextAjax (), чтобы инициировать следующий вызов ajax.

Это должнопозвольте вам симулировать синхронные запросы, не связывая браузер, как это делают реальные синхронные запросы.


ок.некоторый пример кода.вероятно, не будет работать, так как я схожу с головы, но ...

var jobQueue = [];
var ajaxActive = false;

function addToQueue(url, data) {
   jobQueue.push({'url' : url, 'data': data});
   doAjax();
}

function doAjax() {
   if (ajaxActive) { return; } // ajax request still outstanding
   if (jobQueue.length = 0) { return; } // no more work to do
   todo = jobQueue.pop();
   ajaxActive = true;
   $.ajax({
      url: todo.url,
      data: todo.data,
      success: function(returnedata) {
          ... do whatever you need with the returned data ...
          ajaxActive = false;
          doAjax(); // schedule another job, if need be.
      },
      error: function(e) {
          ... handle error ...
          ajaxActive = false;
          doAjax(); // schedule next job, if need be
      }
   });
}
0 голосов
/ 25 августа 2011

Вы должны переписать это, и это сделает вашу логику немного проще. Вы пытаетесь смешивать и сочетать синхронно с асинхронным. Если вы должны сделать 1 вызов на каждый флажок, вам следует переписать код, чтобы обратный вызов в случае успеха / неудачи из вашего xmlhttprequest перешел к следующему флажку. Поскольку у вас есть порядковый номер флажка, вы можете перейти к следующему порядковому положению в случае успеха или неудачи.

Если честно, лучше всего было бы поменять это на один веб-запрос, содержащий все данные. Это сделает ваше приложение быстрее, потому что ему не нужно будет ждать, пока каждый флажок пройдет весь цикл запроса / ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...