Как дождаться завершения AJAX?

Добрый вечер, есть кнопка по которой запускается AJAX, обрабатывается функция, и возвращаются данные.
Суть в том, что если очень быстро нажимать на кнопку, то php функция немножко глючит и некорректно обрабатывает данные.
Нужно каким то образом запретить нажимать на кнопку, либо дождаться полного выполнения php, прежде еще раз запускать ajax
Пробовал делать клик по классу .click, потом remove .click и когда success добавлять .click, но почему то оно все ровно кликает даже без класа.

Может есть решение моей проблемы? Подскажите пожалуйста
  • Вопрос задан
  • 2659 просмотров
Решения вопроса 1
kompi
@kompi
nullstack devoops
var buttonLocked = false;
$('button_selector').on('click', function(e) {
  e.preventDefault();
  if(!buttonLocked) {
     buttonLocked = true;
     $.ajax(...)
       .always(function(data) { buttonLocked = false; });
  }
})
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
RequestBlock = true; // в глобале разрешаем запрос

if (RequestBlock == false) {
	console.log('ничего не делаем');

} else if (RequestBlock == true) {
	RequestBlock = false; // блокируем следующий запрос пока не отработает $.ajax

	$.ajax({
		type: 'POST',
		url: 'URL',
		data: {},
		cache: false,
		dataType: 'JSON',
		timeout: 15000,
		success: function(r) {
			RequestBlock = true;
			console.log(r);
		},
		error: function(jqXHR, textStatus, errorThrown) {
			RequestBlock = true;
		}
	});
}
Ответ написан
heksen
@heksen
Вам синхронный вызов нужен. На jquery async: false. На чистой яве не знаю как. Либо калбэк функция.
Ответ написан
возможно preventDefault поможет
Ответ написан
Комментировать
afishr
@afishr
make const not var
Я наверное не правильно понял. но всё же) Может добавить атрибут disabled к кнопке пока скрипт не выполнится?
Ответ написан
Как вариант, это прерывать аякс запрос при клике на кнопке и посылать его ещё раз.
Дословно не могу сказать что и как делать, так как реализовывал эту задачу довольно давно, но примерно так переменной присваивается $.ajax(...), далее в коде проверяем есть ли на данный момент активный аякс запрос то его прерываем и отправляем по занову. Таким способом у вас исключено несколько идентичных аякс запросов, будет только один, остальные будут прерываться
// Метод abort() отменят текущий HTTP-запрос.
// Метод abort(). Если запрос был оправлен, этот метод отменит его.
var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});
 
// Убить запрос
xhr.abort()
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы