Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.09.2012, 00:54
Новичок на форуме
Отправить личное сообщение для Kelly Посмотреть профиль Найти все сообщения от Kelly
 
Регистрация: 17.12.2011
Сообщений: 9

Получение ответа от функции в которой выполняется ajax
Собственно задумался как реализовать такую штуку.
Допустим у нас нное количество функций с различным функционалом. в которых есть ajax запросы.
http://clip2net.com/s/2g4Jn
В функции с которой вызываются эти фунции (на картинке test() ) допустим нужно выполнить какое-либо действие когда выпонятся все остальные функции. Как это реализовать?
Пример -
function test() {} - обработчик нажатия кнопки. в зависимости от условий выполняется разный набор доп функций. на время выполнения нужно заблокировать нажатие и исполнение функции test() .

Если я мыслю неправильно натолкните на мысль, а то js с его асинхронностью вынесли мне весь мозг.

Если это делается через deferred object - покажите пожалуйста пример
Ответить с цитированием
  #2 (permalink)  
Старый 01.09.2012, 02:20
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Kelly,
Ну а поставить глобальный флаг, изначально в true, по запуску первой функции c аяксом ставим его в false
При попытке запуске какой то функции, первым делом проверяем флаг - если false - вываливаемся, по получению конечной функции (с аяксом) - ставим флаг в true
Ответить с цитированием
  #3 (permalink)  
Старый 01.09.2012, 11:22
Новичок на форуме
Отправить личное сообщение для Kelly Посмотреть профиль Найти все сообщения от Kelly
 
Регистрация: 17.12.2011
Сообщений: 9

Deff, можно и так. тогда получается на каждую функцию добавляем флаг. Я так и делал в основном.
Меня интересует как "в лучших практиках" делать без этого флага вне функции.
Я надеюсь, что понятно донес мысль что хочу сделать. Могу пример нарисовать
Ответить с цитированием
  #4 (permalink)  
Старый 01.09.2012, 12:21
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 07.06.2011
Сообщений: 315

deferred object, если я вас правильно понял. ставите одни функции в зависимости другим.
Ответить с цитированием
  #5 (permalink)  
Старый 01.09.2012, 21:26
Новичок на форуме
Отправить личное сообщение для Kelly Посмотреть профиль Найти все сообщения от Kelly
 
Регистрация: 17.12.2011
Сообщений: 9

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-ное количество таких функций и они могут быть разными

Последний раз редактировалось Kelly, 01.09.2012 в 21:29.
Ответить с цитированием
  #6 (permalink)  
Старый 02.09.2012, 00:57
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Kelly Посмотреть сообщение
$(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;
}
жестко
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #7 (permalink)  
Старый 02.09.2012, 03:05
Новичок на форуме
Отправить личное сообщение для Kelly Посмотреть профиль Найти все сообщения от Kelly
 
Регистрация: 17.12.2011
Сообщений: 9

А что в данной конструкции жесткого?
Ответить с цитированием
  #8 (permalink)  
Старый 10.09.2012, 16:23
Новичок на форуме
Отправить личное сообщение для Kelly Посмотреть профиль Найти все сообщения от Kelly
 
Регистрация: 17.12.2011
Сообщений: 9

Решил я эту задачу. Решается через 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;
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JQuery. Ajax. Глобальные функции Harvey jQuery 5 31.08.2011 16:54
return функции с ajax запросом !? namo86 AJAX и COMET 2 19.01.2011 19:30
ajax, завершение функии до получения ответа Slavenin AJAX и COMET 5 05.12.2010 03:23
Переодическое получение ответа от сервера demoniqus AJAX и COMET 6 22.06.2010 16:09
Ajax и получение ответа до полной загрузки страницы Suspended jQuery 3 16.11.2008 14:57