Я ищу хороший шаблон для отслеживания множества различных асинхронных действий JavaScript (загрузка изображений, несколько вызовов AJAX, последовательные вызовы AJAX и т.д.), которые лучше, чем просто множество пользовательских обратных вызовов и настраиваемого состояния переменные. Что бы вы посоветовали мне использовать? Существует ли какая-либо система очередей с возможностью иметь логику за пределами последовательности?
Пример задачи
У меня есть последовательность запуска, которая включает в себя несколько асинхронных процессов (загрузка изображений, ожидание таймеров, создание некоторых аякс-вызовов, выполнение некоторой инициализации). Некоторые из асинхронных процессов могут запускаться одновременно (загрузка изображений, вызовы AJAX), а некоторые из них должны быть упорядочены (запустить AJAX-вызов №1, затем вызов AJAX №2). Прямо сейчас у меня есть все, что работает от функций обратного вызова и кучи глобального состояния, которое отслеживает то, что было или не было выполнено. Он работает, но он довольно грязный, и у меня было несколько ошибок из-за сложностей, связанных с тем, что вы обрабатываете все возможности последовательности и правильные условия.
Когда у вас есть проблемы, это также довольно больно отлаживать, потому что это похоже на принцип неопределенности Гейзенберга. Как только вы установите точку останова в любом месте последовательности, все изменится. Вы должны поместить в код всевозможные отладочные операторы, чтобы попытаться понять, что происходит.
Вот более конкретное описание:
-
Загружается три изображения. Как только загружается одно конкретное изображение, я хочу его отобразить. Когда он будет отображаться в течение определенного промежутка времени, я хочу отобразить второе изображение. Третий отправляется в очередь для последующего отображения.
-
Существует три вызова AJAX, которые должны выполняться в последовательном порядке (выход одного из них используется как часть ввода следующего).
-
Когда выполняются вызовы AJAX, есть куча JS-обработки результатов, а затем нужно загрузить еще два изображения.
-
Когда загружаются эти два изображения, есть еще несколько материалов для отображения.
-
Когда все это будет сделано, вы изучите, как долго отображалось одно из изображений, и если прошло достаточно времени, отобразите следующее изображение. Если нет, подождите еще некоторое время перед отображением следующего изображения.
Каждый шаг имеет как успешные, так и обработчики ошибок. Некоторые из обработчиков ошибок запускают альтернативный код, который может продолжать успешно.
Я не ожидаю, что кто-нибудь последует за точным процессом здесь, но просто для того, чтобы дать людям представление о типе логики между этапами.
Изменить: я наткнулся на YUI AsyncQueue, который не является полным решением для типа проблемы, которую я имею, но находится в том же пространстве. Кажется, что это больше для упорядочивания или упорядочения множества асинхронных операций, но я не вижу, как это помогает с типом принятия решения, которое у меня есть.