[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Защита от множественных запросов AJAX
Barh
Здравствуйте, форумчане!

Прогуглил интернет, но найти ответ на свой вопрос не смог.

Есть ли в jQuery какая-нибудь функция или параметр, который бы не давал делать повторный запрос, если текущий запрос еще выполняется. Я сделал свой вариант (когда пользователь нажимает на кнопку, по нажатию, которой выполняется AJAX-запрос):
1. Проверяю, если флаг равен FALSE, то идем дальше.. иначе ничего не делаем.
1. Перед запросом ставлю флаг в TRUE.
2. После выполнения запроса ставлю флаг в FALSE.

Конструкция мне не нравится, уверен есть более хороший код. А то, как я написал на мой взгляд моветон..

Надеюсь на помощь, подскажите как защититься от множественных запросов только на стороне клиента, средствами JS или jQuery.
Игорь_Vasinsky
нормальная идея с флагом.

можете следующий запрос отправлять после success:

вообще мы говорим о синхронизации - тут так всегда дела и обстоят - последовательные действия.

при асинхронном аяксе - они параллельны.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Barh
Цитата
можете следующий запрос отправлять после success:

Как это лучше сделать? Мне пришла идея только с флагами. Как это реализовать без них?
Игорь_Vasinsky
Цитата
можете следующий запрос отправлять после success:

тут что не понятного?

$.ajax({
url: '/ajax/example.html', // указываем URL и
dataType : "json", // тип загружаемых данных
success: function (data, textStatus) { // вешаем свой обработчик на функцию success
$.each(data, function(i, val) { // обрабатываем полученные данные
/* ... */

});
}
}
);


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
SerginhoLD
как вариант глобально объявить
var _Ajax = 0;

где то у тебя в коде проверка
if (_Ajax) // давай досвидания
else
_Ajax = $.ajax({
...
});

или можно остановить текущий аякс запрос
if (_Ajax) _Ajax.abort();

_____________
"internet explorer всех правильней отображает страницы" ©
Barh
SerginhoLD,
Игорь_Vasinsky,
Спасибо за советы и ответы на вопросы.
Не знал, что можно сохранить в переменную $.ajax

Сделал так:
Теперь в роли флага выступает readyState. Если он равен 4 или его вообще нет, то можем делать запрос, иначе ничего не делаем.
(AsideAjax, AsideMessage - это мои глобальные объекты)
По моему вполне нормально. Что скажете?

$(document).on('submit', registerForm, function () {

if ( AsideAjax.register === undefined || AsideAjax.register.readyState === 4 )
{
AsideAjax.register = $.ajax({
url : $(this).prop('action'),
type : "POST",
dataType : 'JSON',
data : $(this).serialize(),
success : function ( data ) {
if ( !data.result )
document.AsideMessage.popupOpen( 'error', data.message );
}
}
);
}

return false;
});

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.