jQuery.ajax () последовательные вызовы - PullRequest
1 голос
/ 31 марта 2011

Эй.Мне нужна помощь с вызовами jQuery Ajax.В JavaScript я должен генерировать вызовы ajax к контроллеру, который извлекает значение из модели.Затем я проверяю возвращаемое значение и при необходимости выполняю дополнительные вызовы ajax, например, если значение достигает определенного порога, я могу прекратить вызовы ajax.

Для этого требуются вызовы ajax, которые должны обрабатываться один раз послеДругой.Я попытался использовать async:false, но он зависает в браузере, и любые изменения jQuery, которые я делаю во внешнем интерфейсе, не отражаются.Есть ли способ обойти это ??

Заранее спасибо.

Ответы [ 5 ]

5 голосов
/ 31 марта 2011

Вы должны сделать следующий вызов ajax после того, как первый закончился, например, так:

function getResult(value) {
    $.ajax({
        url: 'server/url',
        data: { value: value },
        success: function(data) {
            getResult(data.newValue);
        }
    });
}
1 голос
/ 13 марта 2015

Я использовал массив шагов и функцию обратного вызова, чтобы продолжить выполнение с начала асинхронного запуска.Прекрасно работает для меня.

var tasks = [];

for(i=0;i<20;i++){
    tasks.push(i); //can be replaced with list of steps, url and so on
}

var current = 0;

function doAjax(callback) {

    //check to make sure there are more requests to make
    if (current < tasks.length -1 ) {

        var uploadURL ="http://localhost/someSequentialToDo";
        //and 
        var myData = tasks[current];

        current++;

        //make the AJAX request with the given data 
        $.ajax({
            type:     'GET',
            url      : uploadURL,
            data: {index: current},
            dataType : 'json',
            success  : function (serverResponse) {
                doAjax(callback);
            }
        });
    }
    else
    {
        callback();
        console.log("this is end");
    }
}

function sth(){
    var datum = Date();

    doAjax( function(){
        console.log(datum); //displays time when ajax started
        console.log(Date()); //when ajax finished
    });

}
console.log("start");
sth();
1 голос
/ 13 сентября 2012

Попробуйте использовать $. Когда () (доступно с версии 1.5) вы можете иметь один обратный вызов, который срабатывает после выполнения всех вызовов, он чище и намного элегантнее.В конечном итоге это выглядит примерно так:

$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1,  a2){
// a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively
    var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
   alert( jqXHR.responseText )
});
1 голос
/ 31 марта 2011

Используйте функцию обратного вызова, есть две: success и error.

со страницы jQuery ajax:

$.ajax({
  url: "test.html",
  context: document.body,
  success: function(){
    // Do processing, call function for next ajax
  }
});

(очень) упрощенный пример:

function doAjax() {

    // get url and parameters
    var myurl = /* somethingsomething */;

    $.ajax({
        url: myurl,
        context: document.body,
        success: function(data){
             if(data < threshold) {
                  doAjax();
             }
        }
    });
}
1 голос
/ 31 марта 2011

В функции обратного вызова success просто сделайте еще один запрос $.ajax, если необходимо.(Установка async: false заставляет браузер запускать запрос в том же потоке, что и все остальное; поэтому он зависает.)

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