My goal is to fire a fetch request to get data from an API after some delay. In my particular case, I have an input field where a user can input a post ID. I don't want fire a fetch request on each number entered in an input field. I want to fire a request only after a user stopped entering data for 1 second. Here is my implementation:
import { useCallback, useEffect, useState } from 'react'
import './App.css'
function debounce(fn, ms) {
let timeoutId
return function (...args) {
if (timeoutId) clearTimeout(timeoutId)
timeoutId = setTimeout(() => {
fn(...args)
}, ms)
}
}
function App() {
const [input, setInput] = useState('')
const fetchData = async () => {
if (input !== '') {
let res = await fetch(`https://jsonplaceholder.typicode.com/posts/${input}`)
let resData = await res.json()
console.log(resData)
}
}
const fireRequest = useCallback(debounce(fetchData, 1000), [])
useEffect(() => {
fireRequest()
}, [input])
return (
<div className='App'>
<input type='text' onChange={(e) => setInput(e.target.value)} value={input}></input>
</div>
)
}
export default App
For some reason, it's not working. There are no errors, and it looks like my data is not being fetched(nothing logs to the console). What am I doing wrong ? Thank you.