Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Подскажите паттерн по отложенному запуску функции? (https://javascript.ru/forum/jquery/34175-podskazhite-pattern-po-otlozhennomu-zapusku-funkcii.html)

Shitbox2 23.12.2012 00:55

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

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

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

DjDiablo 23.12.2012 01:33

Специально для этих ситуаций в 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я сработала") });

Shitbox2 23.12.2012 08:45

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

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

Другой вариант:
$.when( deferred1, deferred2,… )
Подходящая штука, только хорошо бы в место deferred1, deferred2,… напрямую использовать deferred из метода $.ajax, только как получить ссылку на него?

melky 23.12.2012 10:47

Цитата:

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

xhr.type === "add/delete" // ?


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