Получение ответа от функции в которой выполняется ajax
Собственно задумался как реализовать такую штуку.
Допустим у нас нное количество функций с различным функционалом. в которых есть ajax запросы. http://clip2net.com/s/2g4Jn В функции с которой вызываются эти фунции (на картинке test() ) допустим нужно выполнить какое-либо действие когда выпонятся все остальные функции. Как это реализовать? Пример - function test() {} - обработчик нажатия кнопки. в зависимости от условий выполняется разный набор доп функций. на время выполнения нужно заблокировать нажатие и исполнение функции test() . Если я мыслю неправильно натолкните на мысль, а то js с его асинхронностью вынесли мне весь мозг. Если это делается через deferred object - покажите пожалуйста пример :thanks: |
Kelly,
Ну а поставить глобальный флаг, изначально в true, по запуску первой функции c аяксом ставим его в false При попытке запуске какой то функции, первым делом проверяем флаг - если false - вываливаемся, по получению конечной функции (с аяксом) - ставим флаг в true |
Deff, можно и так. тогда получается на каждую функцию добавляем флаг. Я так и делал в основном.
Меня интересует как "в лучших практиках" делать без этого флага вне функции. :write: Я надеюсь, что понятно донес мысль что хочу сделать. Могу пример нарисовать :) |
deferred object, если я вас правильно понял. ставите одни функции в зависимости другим.
|
tadjik1, скорее всего его и нужно использовать. Но я никак не пойму как связать примеры из сети с моим примером.
Вот js + php пример. https://dl.dropbox.com/u/46944175/testjs.zip $(document).ready(function(e){ $(document).on('click','.button',function(e){ testHandler (e.target); }); }); var testHandler = function (target) { var target = $(target); var consoleElement = $('#console'); if (target.is('.disable')) { return false; } var state = ajaxF(consoleElement); var state = ajaxF(consoleElement); /* то как я нашел выход :)*/ target.addClass('disable'); setTimeout(function(){ target.removeClass('disable'); },300); /* --- */ } var ajaxF = function (consoleElement) { $.ajax({ url: "ajax.php", dataType: "json", success: function (data) { consoleElement.append(data.name + "<br>" + data.value + "<br><hr><br>"); } }); // что-то нужно вернуть по завершении в родительскую ф-ию return 0; } php код с рендомной задержкой отправляет ответ. идея в том что-бы пока ответ не пришел - кнопку не разблокировать. Когда это все в одной функции - даже с deferred сделать могу, а как в таком варианте не пойму. Причем что может быть вызвано n-ное количество таких функций и они могут быть разными |
Цитата:
|
А что в данной конструкции жесткого?:-?
|
Решил я эту задачу. Решается через deferred object
Может кому будет интересно $(document).ready(function(e){ $(document).on('click','.button',function(e){ testHandler (e.target); ajaxError (); }); }); var testHandler = function (target) { var target = $(target); var consoleElement = $('#console'); if (target.is('.disable')) { return false; } target.addClass('disable'); var state1 = ajaxF(consoleElement); var state2 = ajaxF(consoleElement); $.when( state1, state2 ).then( function () { target.removeClass('disable'); console.log("success"); }, function(){ console.log("fuck"); } ); } var ajaxF = function (consoleElement) { var xhr = $.ajax({ url: "ajax.php", dataType: "json", success: function (data) { consoleElement.append(data.name + "<br>" + data.value + "<br><hr><br>"); } }); var deferred = $.when( xhr ); return deferred; } |
Часовой пояс GMT +3, время: 03:55. |