2015-07-31 5 views
0

У меня есть ряд асинхронных вызовов, выполняемых в JavaScript. Я хотел бы убедиться, что только один асинхронный вызов находится в полете в любой момент времени. Как я могу это достичь?Ограничение асинхронных вызовов «в полете» в JavaScript

Предоставляет ли библиотека Q что-то актуальное для этого?

+1

Сделайте каждый вызов в функции обратного вызова предыдущего. – Barmar

+1

Можете ли вы объяснить, почему? Казалось бы, единственный способ активно предотвратить второй асинхронный вызов от полета в полете - это «занятый цикл», пока первый не будет завершен, и это не хорошо ... [или на Бармаре просто расположите свой код так, чтобы они запускаются по очереди с обратного вызова предыдущего вызова] – Alnitak

+0

@Alnitak Отдельный вопрос для себя, я думаю. Спасибо – CodingIntrigue

ответ

1

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

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

Если вы хотите отменить вызовы, сделанные во время полета, вам будет действовать простой механизм блокировки. Для любого вызова просто проверьте, истинна ли блокировка, а если нет, запустите запрос и установите для блокировки значение true. Если блокировка истинна, ничего не делайте (отбросьте ее). Снимите блокировку, когда вызов получен или истечет время ожидания.

0

Я не являюсь пользователем Q, но Q - это, по сути, библиотека, реализующая обещания, поэтому вы можете обеспечить это, объединив ряд .then предложений вместе, каждый из которых содержит один вызов или запускает следующий вызов из. выполнил предыдущий вызов AJAX.

0

Что я могу придумать, это использовать очередь функций для обработки ajax-функций на основе результата jQuery.active, который подсчитывает активные вызовы ashync.

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

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

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