Синхронный Ajax с jQuery - PullRequest
3 голосов
/ 11 декабря 2010

У меня есть веб-приложение, которое выполняет тонну $.post() запросов.Сервер должен получать их в том порядке, в котором они были созданы.Чтобы гарантировать это, я сначала подумал, что создам собственную очередь, которая удаляла очередь из очереди и запускала следующий вызов Ajax после завершения предыдущего.

Затем я увидел, что есть опция async:false, которую можно использовать с$.ajax().

Я изменил все свои запросы на использование $.ajax({ async: false, ... }), но когда я отслеживаю их в Firebug, запросы не отправляются один за другим, каждый следующий запрос срабатывает после последнегополучил ответ.

Что тогда должен делать async?Как я могу передать свой Ajax так, чтобы он выполнялся за один раз, а следующий запускается, когда последний завершил (получил ответ)?

1 Ответ

7 голосов
/ 11 декабря 2010

Вместо использования async:false вы можете создать функцию, которая вызывается рекурсивно из обратного вызова.

function sendReq( arr ) {
    var current = arr.shift(); // Remove the first item from the Array.
    $.ajax({
        url: current.url,      // Use the url from the first item.
        success: function( dat ) {
            current.func( dat );  // Call the function of the first item.
            if( arr.length )      // If there are items left in the Array,
               sendReq( arr );    //     make a recursive call, sending
        }                         //     the remainder of the array.
    });
}

// Ordered collection of requests to be made.
var req_set = [
    {url:'someurl', func:function( dat ) { /*do something with dat*/ }},
    {url:'anotherurl', func:function( dat ) { /*do something with dat*/ }},
    {url:'someother', func:function( dat ) { /*do something with dat*/ }}
];
 // Start the first call, sending the entire set.
sendReq( req_set );

Так что в основном:

  • Создайте массив объектов, которые содержат необходимые элементы для запросов.
  • Создать функцию, которая принимает массив.
  • Функция удаляет первый элемент из массива и использует этот объект для заполнения свойств запроса.
  • В обратном вызове после вызова функции для этого элемента сделайте рекурсивный вызов функции, передав остаток от массива.
  • Это будет продолжать рекурсивные вызовы, пока массив не станет пустым.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...