Действие по завершению нескольких асинхронных запросов

Допустим у нас есть несколько асинхронных функций, и нам необходимо выполнить какое-то действие только после того, как все эти асинхронные функции вернут результаты. Как выполнить действие по завершению нескольких асинхронных запросов?

Когда необходимо действие по завершению нескольких асинхронных запросов

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

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

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

Идея реализации действия по завершению нескольких асинхронных запросов

Идея такова:

  1. мы создаём глобальный счетчик, который содержит общее число асинхронных функции;
  2. запускаем все асинхронные функции на выполнение одновременно;
  3. когда любая из этих функций завершается, она вызывает общую функцию, которая отнимает от глобального счетчика единицу и проверят его на равность нулю;
  4. если глобальный счетчик равен нулю — это значит, что все асинхронные функции завершили работу, по-этому можно продолжать выполнение.

Пример реализации действия по завершению нескольких асинхронных запросов

Рассмотрим пример:

Допустим у нас есть 3 независимых асинхронных функции:


По завершению которых, должен построится отчет функцией:


Наш код будет выглядеть примерно так:

Вот и всё.

Выводы

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

Рейтинг
( Пока оценок нет )
Заметки вебмастера
Понравилась статья? Поделиться с друзьями
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: