[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Из 10 запросов получить только последний
VeRTak
Всем привет, ситуация такая по клику посылаю запрос на сервер, 10 раз кликнул 10 раз пошлет на сервер. Как сделать что бы если ответ не пришел, обрубать этот ответ.
Допустим кликнул один раз и следом второй раз, соответсвенно придет два ответа, а нужен только второй. Но если сервер успевает отработать до второго клика, то ответ нужен.
sergeiss
Вот прямо твоя ситуация описана и есть решение smile.gif http://www.thecave.info/how-to-abort-a-pre...uest-in-jquery/

Вообще говоря, нагуглил за 20-30 секунд.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
AllesKlar
Вообще-то нужно не с последствиями бороться, а с причиной.
Что значит "кликнул 10 раз, отправилось 10 запросов"? blink.gif
Да хоть 100500 раз кликнул, ушел один и только один запрос, и пока не придет ответ/ошибка или таймаут, второй запрос отправлен быть не должен.

_____________
[продано копирайтерам]
sergeiss
Цитата (AllesKlar @ 27.01.2018 - 22:54)
Вообще-то нужно не с последствиями бороться, а с причиной.

Вобщем-то да, но ТС хочет именно так, как он хочет smile.gif Переубеждать его и делать, например, веб-сокеты, я не буду. Хотя согласен, надо было их упомянуть в моём ответе. А там пусть сам думает.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Invis1ble
Достаточно после отправки запроса заблокировать элемент UI, например выставить кнопке disabled=true. К тому же, для юзера это более очевидное поведение. По-хорошему, еще обычно индикатор рядом рисуют, пока запрос-ответ летят.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

AllesKlar
Зачем веб-сокеты?
Речь же просто об фронт-енде.
Что-то типа:

onClick() {
if(!Registry.isLoadListActive) {
Registry.isLoadListActive = true
var
xhr = new XMLHttpRequest()
xhr.open('GET', 'http://.../getlist', true)

xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
Registry.isLoadListActive = false
if
(xhr.status != 200) {
console.log('error: ' + xhr.status + ': ' + xhr.statusText)
} else {
console.log('success: ' + xhr.responseText)
}
}
}

xhr.send();
} else {
console.log('request disabled')
}
}


Ну и плюс то, что Invis1ble написал, чтобы юзер не долбил в кнопку, почем зря

_____________
[продано копирайтерам]
VeRTak
Всем спасибо. А если это например не не клик, а ввод с клавиатуры, например при поиске smile.gif
VeRTak
sergeiss Посмотрел этот вариант, он не правильно работает smile.gif
Kusss
Я вот такое использую в своём поиске. Запрос идет на выполнение, если остановили набор в поиске
let timer;
$("#search").on('change keyup', function(e){

if (document.all) {
// Для браузера IE
key_add = event.keyCode;
} else {
// Для остальных браузеров
key_add = e.keyCode;
}

// сброс таймера, если ещё что ввели
if (key_add){
clearTimeout(timer);
}
let value = $(this).val();
// если больше 2 символов
if (value.length >= 2) {

$("#search_loading").show();
timer = setTimeout(function(){
e.preventDefault();
// тут запрос
}, 200);
} else {
$("#search_results").html('');
$("#search_loading").hide();
}
}
);
SerginhoLD
По теме:
1) или не давать пользователю отправить ещё раз запрос
2) или отменять предыдущий xhr.abort() перед новым запросом

_____________
"internet explorer всех правильней отображает страницы" ©
Быстрый ответ:

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