Блог → Реализация цепочки AJAX запросов

Пусть у нас есть массив элементов, для каждого из которых нужно последовательно выполнить AJAX запрос (новый запрос должен отправляться, как только завершиться предыдущий). На самом деле в асинхронной модели программирования это задача не такая уж легкая, как может показаться на первый взгляд.

Единственное, что мне пришло в голову — это написать рекурсивную функцию, для решения поставленной задачи.

$(document).ready(function(){

	var seq = new Array();
	for (i=1; i<101; i++) {
		seq.push(i);
	}
	
	finishCallback = function(){alert('усе')}

	function go(){
		
		if(seq.length) {
			$.ajax({
				url: 'ajax.php?n='+seq.shift(),
				complete: function(){
					go();
				}
			});
		}
		
		else {finishCallback()}
	}	
			
	go();
});

В этом скрипте создается массив, состоящий из ста элементов, и для каждого элемента, последовательно выполняется AJAX запрос (рекурсивно, через callback функцию). После завершения всех запросов будет выполнена функция finishCallback.

Файл ajax.php представляет из себя чудо инженерной мысли, состоящие из 24 символов.

<?php sleep(rand(1,5))?>

Давайте, теперь, немного усложним задачу. Пусть нужно сделать тоже самое, только в несколько потоков. В этом случае скрипт можно переписать следующим образом.

$(document).ready(function(){

    var streams = 10;

    var seq = new Array();
    for (i=1; i<101; i++) {
        seq.push(i);
    }
	
    var finishCount = 0;
    finishCallback = function(){alert('усе');}

    function go(){
        
        if(seq.length) {
            $.ajax({
                url: 'ajax.php?n='+seq.shift(),
                complete: function(){
                    go();
                }
            });
        }
        
        else {
            finishCount++;
            if(finishCount==streams) {finishCallback();}
        }
    }	
        
    for (i=0; i<streams; i++) {
        go();
    }
	
});

Комментарии (7)

lastjeka
Столько всего перечитал, а это то что нужно! Спасибо огромное, очень помогло.
Ответить
Evildevel
Отличная статья, спасибо большое! Помогло.
Ответить
jasperio
Оу, то, что надо! Огромнейшее спасибо :)
Ответить
thooz
Действительно отличная статья, весь мозг себе сломал, а тут счастье подвалило - эта статья ) Теперь запросы идут не разом а по очереди :))))))))
Ответить
Slip
Спасибо тебе добрый человек !!!!!
Ответить
Михаил
Спасибо!!!!
Ответить
Александр
ОГРОМНОЕ СПАСИБО!!!! ЕСТЬ ЖЕ УМНЫЕ ЛЮДИ!!!
Ответить


Оставить свой комментарий


Представтесь, пожалуйста *

Ваш комментарий

Число на картинке *

captcha

На хостинг