Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.05.2014, 10:37
Интересующийся
Отправить личное сообщение для SpiritAbsolute Посмотреть профиль Найти все сообщения от SpiritAbsolute
 
Регистрация: 11.12.2013
Сообщений: 19

Вызов функции по очереди, дожидаясь ответа предыдущего вызова.
Привет всем! Подскажите, пожалуйста, стоит такая задача.
У меня есть функция выдачи карт терминалом!
function return_card(nominal, count) {
        //  Активируем диспенсер
        $.post('core/ajax.php', {
            'modul': 'dispenser',
            'method': 'dispenser_on',
            'nominal': nominal
        }, function(data) {
            if (data.success) {
                //  Простукиваем текущее устройство
                tid_return = setInterval(function() {
                    console.log(count);
                    if (count > 0) {
                        $.post('core/ajax.php', {
                            'modul': 'order_card',
                            'method': 'return_card',
                            'hash': $('#hash').val(),
                            'nominal': nominal
                        },
                        function(data) {
                            if (data.success) {
								console.log(data);
                                if (data.card) {
									$("#modal_window_es_exit").click();
                                    //  Выводим сообщение
									$('#response').append('<p>Получите карту. Карта номиналом '+nominal+'р выдана.</p>');
                                    //  Уменьшаем счетчик
                                    --count;
                                    //console.log(count);
                                }else{
									$("#modal_window_es_exit").click(); 
									getModalWindowES(data.return, 'Внимание');
									//$('#response_card').text('');
									//$('#response_card').text(data.return);
								}
                            } else {
                                //  Перестаем стучаться
                                clearInterval(tid_return);
                                //  Выключаем диспенсер
                                dispenser_off(nominal)
                                //  Выводим сообщение
                                getModalWindowES('Произошел сбой при обращении к устройству выдачи карт<br><br>' + data.error, 'Ошибка');
                            }
                        }, "json")
                    } else {
                        //  Перестаем стучаться
                        clearInterval(tid_return);
                        //  Выключаем диспенсер
                        dispenser_off(nominal)
                    }
                }, 5000)
            } else {
                getModalWindowES(data.error, 'Ошибка');
				dispenser_off(nominal);
            }
        }, "json")
    }

Видов карт много, и для каждой карты свое устройство. Сейчас выдача карт работает через такой способ:
//  Выдаем карту 500
						if (card_500 != 0) {
							return_card(500, card_500);
						}
						//  Выдаем карту 1000
						if (card_1000 != 0) {
							return_card(1000, card_1000);
						}
						//  Выдаем карту 1500
					        if (card_1500 != 0) {
							return_card(1500, card_1500);
						}
						//  Выдаем карту 3000
						if (card_3000 != 0) {
							return_card(3000, card_3000);
						}
						//  Выдаем карту 5000
						if (card_5000 != 0) {
							return_card(5000, card_5000);
						}

При таком способе, они конечно вызываются все сразу. Благодаря тому, что устройства разные это работает, но с небольшим багом. При многократном вызове функции, какой то из вызовов не завершает простукивание clearInterval(tid_return); в результате постоянно продолжается обращения к аякс. Вот захотелось это убрать, да и вообще для стабильности было бы хорошо работать с каждым устройством по отдельности.
Ответить с цитированием
  #2 (permalink)  
Старый 27.05.2014, 14:33
Интересующийся
Отправить личное сообщение для SpiritAbsolute Посмотреть профиль Найти все сообщения от SpiritAbsolute
 
Регистрация: 11.12.2013
Сообщений: 19

От проблемы простукивания удалось избавиться с помощью другой реализации этого простукивания. Вместо setInterval я использовал
(function inner() { 
// Выполняем действия 
    if (/* больше ничего делать не надо */) { 
        callback(); 
    } else { 
        setTimeout(inner, 500); 
    } 
})();

Но вопрос с поочередным обращением к одной функции все равно остается открытым. Интересно
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции и jQuery skeef jQuery 4 28.11.2012 19:21
Получение ответа от функции в которой выполняется ajax Kelly Общие вопросы Javascript 7 10.09.2012 16:23
Двойной вызов функции Tmin10 jQuery 8 08.12.2011 15:19
Вставка элемента в место вызова функции belkir Элементы интерфейса 21 05.08.2011 08:59
Строка вызова функции DMH Общие вопросы Javascript 11 10.08.2010 09:06