вызвать событие после нескольких успешных вызовов ajax

Интересно, какой лучший подход для запуска события после завершения нескольких (неупорядоченных) вызовов ajax.

Чтобы сделать это немного яснее, я хотел бы вызвать метод doSomethingGreat(), который запускает несколько вызовов ajax, порядок, в котором они выполняются, не нужен. Я просто хочу инициировать событие «SomethingGreatFinished», когда все эти вызовы завершились успешно. Я также не хочу объединять эти вызовы в цепочку, потому что это приведет к снижению производительности и будет полностью противоречить идее асинхронного программирования.

Интересно, есть ли а.) общий шаблон для этого, б.) это можно сделать с помощью реактивных расширений для JavaScript (RxJs) или в.) с собственными функциями jquery.

Любая помощь приветствуется!


person Christoph    schedule 21.07.2010    source источник
comment
IIRC, вы можете иметь не более двух одновременных HTTP-запросов на один и тот же сервер. Конечно, два параллельных вызова лучше, чем последовательный, поэтому вы правы, задавая этот вопрос, но имейте в виду, что вы не получите 7 одновременных вызовов ajax.   -  person nickf    schedule 21.07.2010
comment
Ага, понятно. Я этого не знал.   -  person Christoph    schedule 21.07.2010
comment
Хорошая мысль о максимальном количестве одновременных запросов, но, если я правильно помню, это настройка браузера, а некоторые браузеры используют разные значения. веб-блоги. asp.net/mschwarz/archive/2008/07/21/   -  person belugabob    schedule 21.07.2010


Ответы (3)


RxJS позволит вам сделать это с помощью оператора ForkJoin, этот оператор берет N наблюдаемых со значением и создает один наблюдаемый, который срабатывает с массивом, когда все N наблюдаемых завершены.

См. сообщение в блоге Мэтью Подвысоцкого об этом операторе: http://codebetter.com/blogs/matthew.podwysocki/archive/2010/04/23/introduction-to-the-reactive-extensions-for-javascript-идущийпараллельносforkjoin.aspx

person Jeffrey van Gogh    schedule 21.07.2010
comment
Думаю, это именно то, что я искал :-) - person Christoph; 23.07.2010

Вам следует взглянуть на .ajaxStop().

Однако этот callback будет срабатывать при каждом завершенном запросе ajax. Таким образом, чтобы узнать, когда будет выполнен ваш последний запрос, вам нужно либо вызвать .ajaxStart (), или вам нужно повторять global variable для каждого запускаемого вами запроса и decrement для .ajaxStop(). Если эта переменная достигает zero, все ваши запросы выполнены.

person jAndy    schedule 21.07.2010

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

person belugabob    schedule 21.07.2010
comment
Это то, что я делаю сейчас, но я подумал, что должен быть более приятный способ сделать это. Может быть, с реактивными расширениями для JS? - person Christoph; 21.07.2010