Подскажите паттерн по отложенному запуску функции?
Такая ситуация: периодически происходят аякс-запросы и в колбек-функции каждого должна выполняться функция allgood(), но она должна запуститься только когда нет незавершенных запросов. Т.е. должна помещаться в какую-то очередь и выполниться сразу же как появится окно (все ответы будут получены, а новых запросов еще не отправлено).
Есть ли какие-нибудь паттерны или готовые решения на этот счет? Может быть такая ситуация имеет свое название? P.S. И может в jQuery есть какой-нибудь счетчик ожидающих аякс-запросов, который можно было бы прочитать? |
Специально для этих ситуаций в 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я сработала") });
|
В моем конкретном случае подошел бы даже такой метод:
$.ajaxStop(function(){allgood()})
Т.к. allgood() сохраняет порядок расположения элементов и ее можно безболезненно запускать когда угодно, главное, чтобы в это время не добавились или удалились элементы.Правда, если появятся левые аякс запросы, то способ окажется не кошерным. Тогда вроде бы подходит такой вариант:
$(".log").ajaxComplete(function(e, xhr, settings){
if (была запущена функция добавления/удаления) allgood()
});
Но как отследить, что в ajaxComplete участвовали функции добавления/удаления (в моем случае, они посылают post-запрос "type":"add"/"delete").Другой вариант: $.when( deferred1, deferred2,… )Подходящая штука, только хорошо бы в место deferred1, deferred2,… напрямую использовать deferred из метода $.ajax, только как получить ссылку на него? |
Цитата:
xhr.type === "add/delete" // ? |
| Часовой пояс GMT +3, время: 20:13. |