Как выполнить все последовательные вызовы Ajax?

Кто-то должен защитить использование вертикального пробела здесь!:)

if (     cond1 == val1
     and cond2 == val2
     and cond3 == val3
   ):
    do_stuff()

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

if (    cond1 == val1
     or 
        (     cond2_1 == val2_1
          and cond2_2 >= val2_2
          and cond2_3 != bad2_3
        )
   ):
    do_more_stuff()

Да, мы обмениваем немного вертикальной недвижимости на ясность. Определенно стоящий того IMO.

23
задан Jader Dias 18 June 2016 в 11:18
поделиться

6 ответов

Лучший способ сделать это - связать обратные вызовы, как сказал Носредна. Я бы не рекомендовал использовать синхронные XMLHttpRequest, поскольку они блокируют все ваше приложение.

Насколько мне известно, для этого не так много помощников, но вы могли бы сделать что-то вроде обратного FIFO.

1
ответ дан 29 November 2019 в 02:48
поделиться

Вы можете попробовать повествовательный javascript http://www.neilmix.com/narrativejs/doc/

Я сам никогда не использовал его. Если бы я хотел это сделать, я бы установил какую-то абстракцию для связывания асинхронных действий. Как говорили другие, синхронная версия объекта ajax блокирует обработку событий, пока он ожидает ответа. Это заставляет браузер выглядеть так, как будто он завис, пока не получит ответ.

2
ответ дан 29 November 2019 в 02:48
поделиться

Посмотрите на это: http://docs.jquery.com/Ajax/jQuery.ajax (щелкните вкладку «Параметры»).

Но помните синхронный вызов заморозит страницу до тех пор, пока не будет получен ответ, поэтому его нельзя будет использовать на рабочем сайте, потому что пользователи рассердятся, если по какой-либо причине им придется ждать 30 секунд с зависшим браузером.

РЕДАКТИРОВАТЬ: хорошо, с вашим обновлением станет яснее, чего вы хотите достичь;)

Итак, ваш код может выглядеть так:

    $.getJSON("http://example.com/jsoncall", function(data) {
        process(data);
        $.getJSON("http://example.com/jsoncall2", function (data) {
            processAgain(data);
            $.getJSON("http://example.com/anotherjsoncall", function(data) {
                processAgainAndAgain(data);
            });
        });
    });

Таким образом, второй вызов будет выполнен только тогда, когда будет получен ответ на первый вызов и обработано, а третий вызов будет выдан только тогда, когда будет получен и обработан ответ на второй вызов. Этот код предназначен для getJSON, но его можно адаптировать к $ .ajax.

1
ответ дан 29 November 2019 в 02:48
поделиться

У вас есть два варианта, которые я могу придумать. Один из них - связать их через обратные вызовы. Другой - сделать вызовы синхронными, а не асинхронными.

Есть ли причина, по которой вы хотите, чтобы они выполнялись последовательно? Это замедлит работу.

Чтобы сделать вызов синхронным, вы установите для параметра async в вызове Ajax значение false. См. Документацию по адресу http://docs.jquery.com/Ajax/jQuery.ajax#options (щелкните вкладку параметров, чтобы увидеть их).

6
ответ дан 29 November 2019 в 02:48
поделиться

Установите для параметра async значение false, например,

$.ajax({ async: false /*, your_other_ajax_options_here */ });

Ссылка: Ajax / jQuery.ajax

1
ответ дан 29 November 2019 в 02:48
поделиться

Синхронные вызовы не обязательно медленнее, если у вас есть приложение, в котором AJAX-вызовы открываются, отправляются в сокет, а затем закрывают его, множественные вызовы сокета не имеют смысла, поскольку некоторые сокеты могут обрабатывать только одно соединение, и в этом случае постановка данных в очередь, чтобы они отправлялись только после завершения предыдущего вызова AJAX, означает гораздо более высокую пропускную способность.

0
ответ дан 29 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: