Подтвердить что ты не робот

Ожидание ответа jQuery AJAX (ы)

У меня есть страница, которая с помощью jQuery.ajax, которая называется 100 раз (async: true), проблема в том, что когда все они загружаются, мне нужна система, ожидающая возврата всех 100 вызовов до продолжается. Как я могу это сделать?

Спасибо заранее!:)

Update:

Эти вызовы выполняются в цикле for() (из них 100:))

4b9b3361

Ответ 1

Хороший способ сделать это - $.when. Вы можете использовать его следующим образом:

$.when(
    $.ajax({/*settings*/}),
    $.ajax({/*settings*/}),
    $.ajax({/*settings*/}),
    $.ajax({/*settings*/}),
).then(function() {
    // when all AJAX requests are complete
});

В качестве альтернативы, если у вас есть все вызовы AJAX в массиве, вы можете использовать apply:

$.when.apply($, ajaxReqs);

Обратите внимание, что для этого требуется хотя бы jQuery 1.5.


Чтобы добавить запросы AJAX к массиву, сделайте следующее:

var ajaxReqs = [];
for (var i = 0; i < 100; i++) {
    ajaxReqs.push($.ajax({
        /* AJAX settings */
    });
}
$.when.apply($, ajaxReqs).then(function() {
    // all requests are complete
});

Ответ 2

Этот вид проблем возникает повсюду в базе данных SQL-дизайна - и хотя это не совсем то же самое - проблема в том, что вы получите: сетевые коммуникации.

Вам нужно следить за ним, потому что он вернется, чтобы укусить вас, если вы не сделаете это правильно - то есть пользователи будут сильно раздражены. Подождите. Я не могу это подчеркнуть.

Здесь сценарий: Вы хотите передать многие небольшие фрагменты информации с вашего сервера по запросу. Каждый запрос зависит от ряда факторов, действующих эффективно. Все из которых находятся вне вашего контроля:

Wide area Network reposnse time (anywhere in the world right?)
Locak area Network reposnse time (anywhere in the building)
WebServer Load
WebServer Response time
Database response time
Backend Script run time
Javascript run time to process the result
The fact that the browsers are generally limited to 6-8 parallel AJAX requests at once (I think - someone correct me on the exact number)

Умножьте это по запросу (erm... в вашем случае x 100)

Получить изображение?

Это может работать блаженно в тестах на локальном компьютере. Возможно, вы даже запускаете свой собственный db и веб-сервер на той же машине... но попробуйте это в дикой природе, и вскоре вы попадете в ненадежность в качестве проблемы.

Слушайте, проще всего сделать все ваши параметры в ОДНОМ массиве JS и отправить его в ONE POST-запрос. Затем на сервере все ваши базы данных выбирают и сворачивают ответы в ONE JSON/XML-ответ.

В этот момент вы только ожидаете ответа ONE AJAX. Вы можете найти все свои данные в результате JSON/XML.

Учитывая, что вы работаете со 100 запросами, вы, вероятно, сможете реально измерить экономию времени с помощью секундомера!

Возьмите его у меня - сделайте как можно меньше сетевых запросов.

Ответ 3

Вы можете использовать Отложенный объект api. Пока $.ajax возвращает отложенный объект, вы можете попробовать следующий код для использования цикла:

var ajaxes = [];
for (i = 1; i < 100; i++) {
  ajaxes[i] = $.ajax({/*data*/});
}

$.when.apply( ajaxes )
   .then(function(){
      console.log( 'I fire once all ajax requests have completed!' );
   })
   .fail(function(){
      console.log( 'I fire if one or more requests failed.' );
   });

P.S. Существует отличная статья об использовании отложенных объектов Эриком Хиндом Использование отложенных в jQuery 1.5

Ответ 4

100 звонков Ajax? Кажется очень странным требованием, и то, что вы пытаетесь достичь, вполне может быть достигнуто с помощью другого метода:

var i = 0;

function myCallback() {
    alert('Completed 100 times');
}

function doAjax() {
    $.ajax({
        url: 'blah.php',
        data: 'hello=world',
        success: function(response) {
            i++;
        },
        complete: function() {
            if(i < 100) {
                doAjax();
            } else {
                myCallback();
            }
        }
    });
}

doAjax(); // start

Ответ 5

Я не парень JS, но я бы создал глобальную переменную, это будет счетчик и определит функцию времени, чтобы периодически проверять этот глобальный var, если он достиг 100 или нет.

EDIT: setTimeout()