Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.12.2012, 00:55
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Подскажите паттерн по отложенному запуску функции?
Такая ситуация: периодически происходят аякс-запросы и в колбек-функции каждого должна выполняться функция allgood(), но она должна запуститься только когда нет незавершенных запросов. Т.е. должна помещаться в какую-то очередь и выполниться сразу же как появится окно (все ответы будут получены, а новых запросов еще не отправлено).

Есть ли какие-нибудь паттерны или готовые решения на этот счет? Может быть такая ситуация имеет свое название?

P.S. И может в jQuery есть какой-нибудь счетчик ожидающих аякс-запросов, который можно было бы прочитать?

Последний раз редактировалось Shitbox2, 23.12.2012 в 01:04.
Ответить с цитированием
  #2 (permalink)  
Старый 23.12.2012, 01:33
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Специально для этих ситуаций в jquery есть deffered http://habrahabr.ru/post/113073/

либо всё по минимуму на javascript (в примере timeout вместо ajax для удобства но суть таже)
сначало выполнятся все три таймера затем только сработает три кэлбека в порядке их добавления.

function ajx (){
		var count=0;
		var funcs=[];
		return function(time,fun){
			count++;
			funcs.push(fun);

			setTimeout(function(){
				count--;		
				if (count==0) {  
					for (var i=0;i<funcs.length;i++  ) funcs[i]();
					funcs=[];
				}
			},time);
		}
}

       //пример использования
	test=ajx( );
	test(3000,function(){ alert("1я сработала") });
	test(100,function(){ alert("2я сработала") });
	test(1000,function(){ alert("3я сработала") });
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 23.12.2012 в 02:39.
Ответить с цитированием
  #3 (permalink)  
Старый 23.12.2012, 08:45
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

В моем конкретном случае подошел бы даже такой метод:
$.ajaxStop(function(){allgood()})
Т.к. allgood() сохраняет порядок расположения элементов и ее можно безболезненно запускать когда угодно, главное, чтобы в это время не добавились или удалились элементы.

Правда, если появятся левые аякс запросы, то способ окажется не кошерным. Тогда вроде бы подходит такой вариант:
$(".log").ajaxComplete(function(e, xhr, settings){
    if (была запущена функция добавления/удаления) allgood()
});
Но как отследить, что в ajaxComplete участвовали функции добавления/удаления (в моем случае, они посылают post-запрос "type":"add"/"delete").

Другой вариант:
$.when( deferred1, deferred2,… )
Подходящая штука, только хорошо бы в место deferred1, deferred2,… напрямую использовать deferred из метода $.ajax, только как получить ссылку на него?
Ответить с цитированием
  #4 (permalink)  
Старый 23.12.2012, 10:47
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Shitbox2
Но как отследить, что в ajaxComplete участвовали функции добавления/удаления (в моем случае, они посылают post-запрос "type":"add"/"delete").
xhr.type === "add/delete" // ?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите функции romm Общие вопросы Javascript 20 21.05.2016 16:21
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21
Подскажите, как работает простой код (замыкание функции)? Dotod Общие вопросы Javascript 5 02.12.2009 04:03