Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.04.2021, 23:37
Интересующийся
Отправить личное сообщение для vlad_kl Посмотреть профиль Найти все сообщения от vlad_kl
 
Регистрация: 16.06.2020
Сообщений: 22

Как поставить задержку на fetch при событии oninput
Всем добрый день!
Нужна ваша помощь.

Такая задача. Дан инпут, пользователь вводит что-то в инпут и каждый раз в живом режиме так сказать должен улетать запрос на сервер.
Для примера в коде ниже я взял запрос на jsonplaceholder.

Суть в том, что каждое событие печатания генерит кучу запросов на сервер. Нужно поставить задержку или так называемый denounce на отправку запросов.
Допустим, отправлять запрос на сервер спустя 1 секунду после того, как сработало событие oninput (по сути, как человек перестал печатать).

let request = function() {
	return fetch('https://jsonplaceholder.typicode.com/users')
	.then(response => response.json())
	.then( data => console.log(data))
}

let area = document.querySelector('input');
area.addEventListener('input', request)


В интернете достаточно информации по этому поводу, но мне так и не удалось найти подходящее решение. Или не работает код, или я что-то не так делаю, или ещё что-то

Прошу вашей помощи в моём примере, как сделать именно этот пример так, что оно работало

Спасибо заранее.
Ответить с цитированием
  #2 (permalink)  
Старый 13.04.2021, 23:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

vlad_kl,
let time;
let area = document.querySelector('input');
area.addEventListener('input', function() {
clearTimeout(time);
time = setTimeout(request, 300)
})
Ответить с цитированием
  #3 (permalink)  
Старый 14.04.2021, 00:18
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

vlad_kl,
Вам сюда https://learn.javascript.ru/call-apply-decorators
Ответить с цитированием
  #4 (permalink)  
Старый 14.04.2021, 09:23
Интересующийся
Отправить личное сообщение для vlad_kl Посмотреть профиль Найти все сообщения от vlad_kl
 
Регистрация: 16.06.2020
Сообщений: 22

Сообщение от Vlasenko Fedor Посмотреть сообщение
vlad_kl,
Вам сюда https://learn.javascript.ru/call-apply-decorators
Я уже это прочитал, но не совсем понятно мне, как корректно применить декораторы

Последний раз редактировалось vlad_kl, 14.04.2021 в 09:27.
Ответить с цитированием
  #5 (permalink)  
Старый 14.04.2021, 09:31
Интересующийся
Отправить личное сообщение для vlad_kl Посмотреть профиль Найти все сообщения от vlad_kl
 
Регистрация: 16.06.2020
Сообщений: 22

Сообщение от рони Посмотреть сообщение
vlad_kl,
let time;
let area = document.querySelector('input');
area.addEventListener('input', function() {
clearTimeout(time);
time = setTimeout(request, 300)
})
Рони, спасибо большое, вроде всё работает!
Но есть 1 вопрос у меня. Как понятно корректно и достоверно, запрос отправился только 1 раз спустя время в таймауте? Или запрос отправлялся каждый раз, когда срабатывало событие oninput, но каждый раз с задержкой в 300ms???
Можно ли это понять?
У меня есть ощущение, что запросов всё равно уходит столько, сколько раз я что-то напечатал в инпуте, просто запросы улетают с задержкой.

Спасибо заранее

Последний раз редактировалось vlad_kl, 14.04.2021 в 09:44.
Ответить с цитированием
  #6 (permalink)  
Старый 14.04.2021, 10:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

vlad_kl,
увеличьте 300 до 300 - 1500, на данный момент, если между нажатиями время меньше 300ms , то отправка будет только после последнего нажатия, если вы жмёте медленнее то каждый раз.
Ответить с цитированием
  #7 (permalink)  
Старый 14.04.2021, 10:07
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от vlad_kl
У меня есть ощущение, что запросов всё равно уходит столько, сколько раз я что-то напечатал в инпуте, просто запросы улетают с задержкой.
Для борьбы с ощущениями есть браузерный dev-tools

В коде от Рони запрос будет отправляться всегда, только если ты долбишь чем-нибудь по клавиатуре реже 1 раза в 300 мс. Иначе каждый раз предыдущий таймер отменяется и начинает ждать снова.
Ответить с цитированием
  #8 (permalink)  
Старый 14.04.2021, 12:57
Интересующийся
Отправить личное сообщение для vlad_kl Посмотреть профиль Найти все сообщения от vlad_kl
 
Регистрация: 16.06.2020
Сообщений: 22

Сообщение от рони Посмотреть сообщение
vlad_kl,
увеличьте 300 до 300 - 1500, на данный момент, если между нажатиями время меньше 300ms , то отправка будет только после последнего нажатия, если вы жмёте медленнее то каждый раз.
Да, я именно так и проверил. Через дев тулзы.
Спасибо большое вам за помощь.
Ответить с цитированием
  #9 (permalink)  
Старый 14.04.2021, 14:09
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

https://www.npmjs.com/package/awesome-debounce-promise
__________________
29375, 35
Ответить с цитированием
  #10 (permalink)  
Старый 14.04.2021, 14:26
Интересующийся
Отправить личное сообщение для vlad_kl Посмотреть профиль Найти все сообщения от vlad_kl
 
Регистрация: 16.06.2020
Сообщений: 22

Сообщение от Aetae Посмотреть сообщение
https://www.npmjs.com/package/awesome-debounce-promise
Решение, возможно, супер крутое, но кода много))
А мы помним, главное в программировании что? мало кода
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как делать редирект при клике по adsense? kaylos Общие вопросы Javascript 0 30.09.2016 12:44
Как избежать полосы прокрутки при анимации Bizon4ik Общие вопросы Javascript 4 21.06.2014 13:51
как поставить задержку на .load при .click ufaclub jQuery 1 26.12.2013 10:46
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как задать изменение src при прокрутке chandler Элементы интерфейса 3 12.01.2012 01:23