Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получение ответа от функции в которой выполняется ajax (https://javascript.ru/forum/misc/31277-poluchenie-otveta-ot-funkcii-v-kotorojj-vypolnyaetsya-ajax.html)

Kelly 01.09.2012 00:54

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

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

Если это делается через deferred object - покажите пожалуйста пример :thanks:

Deff 01.09.2012 02:20

Kelly,
Ну а поставить глобальный флаг, изначально в true, по запуску первой функции c аяксом ставим его в false
При попытке запуске какой то функции, первым делом проверяем флаг - если false - вываливаемся, по получению конечной функции (с аяксом) - ставим флаг в true

Kelly 01.09.2012 11:22

Deff, можно и так. тогда получается на каждую функцию добавляем флаг. Я так и делал в основном.
Меня интересует как "в лучших практиках" делать без этого флага вне функции. :write:
Я надеюсь, что понятно донес мысль что хочу сделать. Могу пример нарисовать :)

tadjik1 01.09.2012 12:21

deferred object, если я вас правильно понял. ставите одни функции в зависимости другим.

Kelly 01.09.2012 21:26

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

nerv_ 02.09.2012 00:57

Цитата:

Сообщение от Kelly (Сообщение 202413)
$(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;
}

жестко

Kelly 02.09.2012 03:05

А что в данной конструкции жесткого?:-?

Kelly 10.09.2012 16:23

Решил я эту задачу. Решается через 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.