Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как правильно организовать задержку и обнуление Ajax запроса. (https://javascript.ru/forum/misc/51058-kak-pravilno-organizovat-zaderzhku-i-obnulenie-ajax-zaprosa.html)

vuler 22.10.2014 17:58

Как правильно организовать задержку и обнуление Ajax запроса.
 
Всем добрый день.
Есть каталог, который в по ajax подтягивает данные из БД. Нужно реализовать задержку, чтобы пользователь не мог отсылать более одного запроса
в 3 секунды и если за 3 секунды произошел еще один запрос к БД, то старый запрос обнулялся.
Вот Код:
var ajax_timer;

function pl_perehod_data(){
href=$(this).attr('href');
page_num=$(this).closest('.page_lister').find('input').val();
	clearTimeout(ajax_timer);
	ajax_timer=setTimeout(function(element){
		$.ajax({ type: 'POST',dataType: 'json', url:"../php_scripts/catalogs_tools.php",
			 data:({href:href,page_num:page_num, task:"take_page_data_perehod"}),context: element,
			success: function(data){
					block=$(this).closest('.page_lister').parent();
					block.find('.page_lister').replaceWith($(data.lister_body));
					block.find('.catalog').replaceWith($(data.catalog_body));	
			}})
	},3000,$(this))
}



$(document).ready(function() {

$('body').on('click','.personal_card .opener',cat_open_close_card);
$('body').on('click','.page_lister a',pl_get_link_data);
$('body').on('click','.page_lister .js_perehod',pl_perehod_data);

})

Вопрос по Метке ajax_timer, ее приходится выносить в глобальную область. Есть какой-то вариант, чтобы он хранился в функции как статическая переменная,
или есть способ еще проще без Таймаута?

kostyanet 22.10.2014 18:02

А вы меняйте курсор с normal на wait во время ожидания и нормальный юзер таким курсором никогда не сможет воспользоваться, то есть ткнуть куда-то. Затем меняйте wait на normal. А ненормальных в зад.

kostyanet 22.10.2014 18:06

Цитата:

Сообщение от vuler
Есть каталог, который в по ajax подтягивает данные из БД

Пользуясь случаем хотел бы узнать у знатока, поскольку задумывался поменять паги на подтяги. Как в подтягивании индексируется что не подтянуто? РОботы теперь научились прокручивать эээ страницы?

danik.js 22.10.2014 18:42

Цитата:

Сообщение от vuler
href=$(this).attr('href');

Это ни о чем не говорит?

Кстати, нафиг усложнять? Почему не this.href?

danik.js 22.10.2014 18:44

Цитата:

Сообщение от vuler
и если за 3 секунды произошел еще один запрос к БД, то старый запрос обнулялся.

А как он произойдет, если
Цитата:

Сообщение от vuler
пользователь не мог отсылать более одного запроса
в 3 секунды

?

danik.js 22.10.2014 18:53

Я не понял. У тя ща перед запросом задержка 3с. Тебя это устраивает или нет?

Запоминай время последнего запроса, а также чекай readyState последнего запроса. Вместо readyState можешь просто по success'у выставлять флаг.

момент запроса
заняты = нет

запрос затупил = (момент запроса - сейчас) > 3 сек
если (не заняты или запрос затупил)
    если запрос затупил  то делаем аборт
    делаем запрос, заняты = да, момент запроса = сейчас (по саксессу заняты = нет)


Вместо заняты можно просто обнулять момент запроса, что будет означать что запрос уже завершен, то есть не заняты.

danik.js 22.10.2014 18:56

Цитата:

Сообщение от danik.js
Это ни о чем не говорит?

Это было обращено kostyanet, если че.


Часовой пояс GMT +3, время: 08:46.