Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как поставить задержку на fetch при событии oninput (https://javascript.ru/forum/misc/82286-kak-postavit-zaderzhku-na-fetch-pri-sobytii-oninput.html)

vlad_kl 13.04.2021 23:37

Как поставить задержку на 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)


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

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

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

рони 13.04.2021 23:46

vlad_kl,
let time;
let area = document.querySelector('input');
area.addEventListener('input', function() {
clearTimeout(time);
time = setTimeout(request, 300)
})

Vlasenko Fedor 14.04.2021 00:18

vlad_kl,
Вам сюда https://learn.javascript.ru/call-apply-decorators

vlad_kl 14.04.2021 09:23

Цитата:

Сообщение от Vlasenko Fedor (Сообщение 535536)

Я уже это прочитал, но не совсем понятно мне, как корректно применить декораторы :blink: :( :cray:

vlad_kl 14.04.2021 09:31

Цитата:

Сообщение от рони (Сообщение 535535)
vlad_kl,
let time;
let area = document.querySelector('input');
area.addEventListener('input', function() {
clearTimeout(time);
time = setTimeout(request, 300)
})

Рони, спасибо большое, вроде всё работает!
Но есть 1 вопрос у меня. Как понятно корректно и достоверно, запрос отправился только 1 раз спустя время в таймауте? Или запрос отправлялся каждый раз, когда срабатывало событие oninput, но каждый раз с задержкой в 300ms???
Можно ли это понять?
У меня есть ощущение, что запросов всё равно уходит столько, сколько раз я что-то напечатал в инпуте, просто запросы улетают с задержкой.

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

рони 14.04.2021 10:07

vlad_kl,
увеличьте 300 до 300 - 1500, на данный момент, если между нажатиями время меньше 300ms , то отправка будет только после последнего нажатия, если вы жмёте медленнее то каждый раз.

Alexandroppolus 14.04.2021 10:07

Цитата:

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

Для борьбы с ощущениями есть браузерный dev-tools

В коде от Рони запрос будет отправляться всегда, только если ты долбишь чем-нибудь по клавиатуре реже 1 раза в 300 мс. Иначе каждый раз предыдущий таймер отменяется и начинает ждать снова.

vlad_kl 14.04.2021 12:57

Цитата:

Сообщение от рони (Сообщение 535544)
vlad_kl,
увеличьте 300 до 300 - 1500, на данный момент, если между нажатиями время меньше 300ms , то отправка будет только после последнего нажатия, если вы жмёте медленнее то каждый раз.

Да, я именно так и проверил. Через дев тулзы.
Спасибо большое вам за помощь.

Aetae 14.04.2021 14:09

https://www.npmjs.com/package/awesome-debounce-promise

vlad_kl 14.04.2021 14:26

Цитата:

Сообщение от Aetae (Сообщение 535549)

Решение, возможно, супер крутое, но кода много))
А мы помним, главное в программировании что? мало кода :dance:


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