Вызов функции по очереди, дожидаясь ответа предыдущего вызова.
Привет всем! Подскажите, пожалуйста, стоит такая задача.
У меня есть функция выдачи карт терминалом! 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); в результате постоянно продолжается обращения к аякс. Вот захотелось это убрать, да и вообще для стабильности было бы хорошо работать с каждым устройством по отдельности. |
От проблемы простукивания удалось избавиться с помощью другой реализации этого простукивания. Вместо setInterval я использовал
(function inner() { // Выполняем действия if (/* больше ничего делать не надо */) { callback(); } else { setTimeout(inner, 500); } })(); Но вопрос с поочередным обращением к одной функции все равно остается открытым. Интересно :) |
Часовой пояс GMT +3, время: 14:16. |