Подскажите паттерн по отложенному запуску функции?
Такая ситуация: периодически происходят аякс-запросы и в колбек-функции каждого должна выполняться функция 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, время: 04:51. |