restalpo
@restalpo

Поочередное выполнение функций (опять)?

Здравствуйте!
Заранее извините за нубский вопрос, я честно пытаюсь вникнуть в promise, JqueryDeffered, но все время попадаются примеры, которые трудно применить к моей простейшей ситуации. Мне нужно просто направление к RTFM.

Есть кнопка и скрытый див с сообщением об ошибке.

<button class="send">Click</button>
<div class="error"></div>


По клику кнопки AJAX-запрос, который возвращает успех/неудачу (в примере на jsfiddle сделано, чтобы возвращало всегда ошибку). В соответствии с этим, показывается поле с ошибкой.

$('.send').on('click', function() {
		hideError();
		getGrabberInfo();
	});

	var getGrabberInfo = function() {
		$.ajax({
			url: "/echo/json/",
			type: "POST",
			data: {1:1},
			beforeSend : function() {
				console.log('beforeSend');
			},
			success: function(data) {
				showError(); // показать ошибку
			}			
		});			
	};


Для показа\скрытия ошибки используется animate.css.

Проблема в том, что при клике нужно плавно скрывать ошибку (если она есть), затем вызывать функцию с аяксом. Понятно, что асинхронность делает свое черное дело — ошибка скрывается, запрос происходит, но повторно функция для показа ошибки не вызывается (функция скрытия уже отработала). Если переписать все без использования эффектов, мгновенно, все нормально.

Два вопроса:
1. Как добиться скрытия ошибки, затем аякс-запроса, затем показа ошибки последовательно?
2. Если быстро-быстро кликать, поле ошибки будет колбасить. Думаю, справиться с этим, введя блокирующую переменную. Куда ее лучше вставить и проверять?

Мне нужно понять именно на таком простом примере. Спасибо за любую помощь!

Полный код: https://jsfiddle.net/1w9moseu/
  • Вопрос задан
  • 548 просмотров
Решения вопроса 2
1) Скрываешь ошибку, делаешь запрос, в методе error (у тебя почему то success) показываешь ошибку - зачем вообще промисы тут?
2) Добавляешь кнопке какой-нибудь класс (это удобно, так как заодно можно стили добавить, показывающие невозможность клика) и если класс присутствует - игнорируешь событие.
Ответ написан
restalpo
@restalpo Автор вопроса
В общем, еще раз посмотрел и сделал, что нужно. Спасибо Денис Букреев, навел на мысли с setTimeout. Это наваял на скорую руку. В итоге получается такая анимация: 208d0358a58943d6bff57fced7bbca91.gif

При каждом запросе, сначала плавно скрывается ошибка, затем запрос, кое-что проверяется и ошибка вываливается вновь.

Всем спасибо!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $
Rocket Брянск
от 60 000 до 100 000 ₽
22 мая 2024, в 21:04
2000 руб./за проект
22 мая 2024, в 20:47
50000 руб./за проект
22 мая 2024, в 20:14
3600 руб./за проект