Получение ответа от функции в которой выполняется 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, время: 07:16. |