Потокобезопасная очередь в Javascript или jQuery - PullRequest
12 голосов
/ 17 января 2011

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

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

Ответы [ 4 ]

25 голосов
/ 17 января 2011

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

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

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

Многопоточность может быть достигнута в (более новых) версиях Javascript с использованием Web Workers , но они явно включены. Ищите их, если вам интересно.

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

5 голосов
/ 17 января 2011

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

0 голосов
/ 17 января 2011

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

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

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

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

0 голосов
/ 17 января 2011

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

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

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

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