Резервная очередь в Javascript или jQuery

У меня много асинхронных вызовов AJAX, результаты которых будут обработаны. Неважно, какой порядок обработки происходит, но результаты должны обрабатываться по одному. Поэтому я хотел бы просто выполнить мои вызовы AJAX, и все они просто помещают свои результаты в одну очередь. Затем очередь должна обрабатываться в одном потоке. Таким образом, результаты обрабатываются по одному как можно скорее.

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

Ответ 1

Асинхронный НЕ означает "несколько потоков". Подумайте о том, как много событий кликов запускаются подряд, прежде чем обрабатывается обработчик первого клика. За один раз можно обрабатывать только одно действие, а остальные будут ждать выполнения.

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

Эти очереди иногда называются "Runloops". Javascript будет вращаться в бесконечном цикле, извлекать событие из очереди, обрабатывать его и возвращаться в очередь для другой части работы.

Многопоточность может быть достигнута в (более новых) версиях Javascript с помощью Рабочих веб-сайтов, но они явно запрещены. Посмотрите их, если вы заинтересованы.

Чтобы ответить на ваш вопрос, просто приложите обратный вызов к асинхронному запросу, и он завершит обработку, даже если другой ответ будет возвращен на полпути. Другой ответ будет "ждать" до тех пор, пока не будет обработано текущее событие.

Ответ 2

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

Ответ 3

Самый простой способ - реализовать свою собственную систему очередей для обратных вызовов (используя push/pop для эмуляции стека).

Как только каждый асинхронный запрос возвращается, добавьте данные в конец массива и запустите некоторую команду queue.process(), которая будет обрабатывать первый элемент в массиве.

Наконец, добавьте что-то вроде if(alreadyRunning) { return; } в начало этой функции, чтобы остановить его выполнение более одного раза, и у вас есть одна очередь с одной цепочкой.

изменить: удаленный код, некоторые люди повесились на нем вместо исходного вопроса

Ответ 4

Возможно, вы захотите взглянуть на Обмен сообщениями событий между объектами JavaScript.

Я использовал реализацию, аналогичную публикации в блоге с плагином jQuery под названием ajaxMonitor.

Как он работает, как только вызываемый вызов вызывает запрос AJAX, он обновляет таблицу HTML. Обратные вызовы происходят асинхронно.

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