Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   AJAX в порядке очереди (https://javascript.ru/forum/extjs/16018-ajax-v-poryadke-ocheredi.html)

posta 23.03.2011 08:21

AJAX в порядке очереди
 
Как сделать, что бы ajax запросы выполнялись в порядке очереди.

Попробывал сделать так:
var ReadyNext=true;

if (ReadyNext) {run(btn,'getTotalCount');}

while (ReadyNext==false) {
	if (ReadyNext) {run(btn,'getList', '......');}
}

								
			
var run = function(){		
	ReadyNext=false;
	Ext.Ajax.request({
		waitMsg: 'Секундочку...',
		url: 'synchro.php',					
		success: function (response){
					var resp=response.responseText;
					ReadyNext=true;
				},
		failure: function (response){								
					var resp=response.responseText;
				},
		params: {							
					request:host,
					cmd:cmd
				}
	});					
}


Но из-за того, что запросы асинхронны, то все идет не подряд, а параллельно.
Кто сталкивался - отпишитесь.

А еще лучше - описать способ прохождения такого списка порядку.

VKS 23.03.2011 10:27

function run(btn, host){

var iteration = 0;
	Ext.Ajax.request({
		waitMsg: 'Секундочку...',
		url: 'synchro.php',					
		success: function (response){
					var resp=response.responseText;
					switch (iteration) {case 0: run(...); iteration++; break; ...}

				},
		failure: function (response){								
					var resp=response.responseText;
				},
		params: {							
					request:host,
					cmd:cmd
				}
	});					
}


Выполняйте рекурсивно запрос в блоке success

Добрый слоник 23.03.2011 10:30

Логика простая: учитывая, что тебе нужно по порядку, то тебе асинхронность не нужна, а значит отсылай запросы синхронно.
Но учитывая, что Ext.Ajax.request синхронно не умеет...используй стандартный XMLHttpRequest :)

Kolyaj 23.03.2011 10:43

Цитата:

Сообщение от Добрый слоник
Логика простая: учитывая, что тебе нужно по порядку, то тебе асинхронность не нужна, а значит отсылай запросы синхронно.

Отличная логика: отправляй много запросов синхронно и повесь наглухо браузер.

Добрый слоник 23.03.2011 10:47

поясни? :)

Kolyaj 23.03.2011 10:49

Что пояснить? Что пока обрабатывается синхронный запрос, браузер ни на что не реагирует? Так это из названия понятно. Синхронный -- т.е. все сидят и ждут, когда он завершится.

Добрый слоник 23.03.2011 12:35

Kolyaj
В целом - холивар...я сейчас выскажу свою точку зрения, ты, если посчитаешь нужным свою....но до усрачки спорить не будем, ок?

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

Но есть другие задачи, например:
1. подгрузка списков в select'ы, отправка формы, "показать детали" и пр. когда при любом раскладе пока не догрузится пользователю, по сути нифига не сделать, а только смотреть на надпись "секундочку", "минуточку", "идет загрузка", "подождите".
Так елки, покажи надпись "Подождите..." загрузи синхронно, покажи "Ура дождались" :)

В данном варианте я вижу 2 вещи:
1." Секундочку" - с такими надписями фоновые проверки не делаются
2. автор не может отправить запрос пока не получил ответ от предыдущего.

Моя позиция - грузи синхронно - логика проще, а толку столько же.

Kolyaj 23.03.2011 12:43

Цитата:

Сообщение от Добрый слоник
В целом - холивар...

Холивар -- это когда обсуждаются равноценные вещи.

Цитата:

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

Непонятно, к чему сказано.

Цитата:

Сообщение от Добрый слоник
когда при любом раскладе пока не догрузится пользователю, по сути нифига не сделать

Почему нифига? Я могу захотеть просто закрыть сайт, если данные долго не грузятся. В случае синхронного запроса я могу только убить процесс браузера.

Цитата:

Сообщение от Добрый слоник
Моя позиция - грузи синхронно - логика проще

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

Добрый слоник 23.03.2011 16:13

Цитата:

Непонятно, к чему сказано.
Построение ответа было такое (все по личному мнению) :)
1. Где нужна асинхронность (примеры)
2. Где не нужна (примеры)
3. Выводы
Цитата:

Я могу захотеть просто закрыть сайт
не остра проблема...не остра....чтоб уж голова о ней болела...
1. Потому, что на медленных соединениях вообще крайне не приятно работать
2. Проблема есть только в IE 6 - а он медленно и верно умирает
3. Объемы "Войны и мира" передаются крайне редко :)
Цитата:

сделай себе проще, а пользователю хуже.
некорректно....есть некая разница между простым решением и халтурным. Я за простые решения :)

posta 23.03.2011 17:02

Цитата:

Сообщение от VKS (Сообщение 97657)
function run(btn, host){

var iteration = 0;
	Ext.Ajax.request({
		waitMsg: 'Секундочку...',
		url: 'synchro.php',					
		success: function (response){
					var resp=response.responseText;
					switch (iteration) {case 0: run(...); iteration++; break; ...}

				},
		failure: function (response){								
					var resp=response.responseText;
				},
		params: {							
					request:host,
					cmd:cmd
				}
	});					
}


Выполняйте рекурсивно запрос в блоке success


Решил с помощью Коллбеков. Если надо напишу. без итераций.

VKS 23.03.2011 17:42

Цитата:

Решил с помощью Коллбеков. Если надо напишу. без итераций.
Так это и есть решение с помощью калбека.

b099ard 08.04.2011 09:59

Не факт, можно отдельным потоком сделать

Мойша 10.10.2011 00:35

Напиши, если сделал
 
Будь любезен.

melky 10.10.2011 07:40

Цитата:

Сообщение от b099ard (Сообщение 99778)
Не факт, можно отдельным потоком сделать

прошу пример

словами, не обязательно кодом.

ArJ 14.10.2012 22:24

Спасибо за тему!
Только вот всё равно никак не могу разобраться, скажите пожалуйста, что не так?

function ajax() {
    var statusElem = document.getElementById('table');
    var i = 2;
    function recurs(i) {
        Elem = statusElem.rows[i];
        var add_site = Elem.getAttribute('id')
        Elem.innerHTML = '<td align="center" colspan="10"><img src="data/img/ajax.gif" width="32" height="32" /></td>'
        $.ajax({
           dataType: "text",
           timeout: 3000,
           cache: false,
           type: "POST",
           url: "index.php",
           data: 'mode=chk_one&site='+add_site,
           success: function(msg){Elem.innerHTML = msg;
           if (i<statusElem.rows.length) {recurs(i++);}
           }
        })
    }
}


Часовой пояс GMT +3, время: 18:14.