let timer;
document.querySelector('#input').addEventListener('input', () =>
if (timer) { // 이전 요청의 timer가 남아있다면 지우기
clearTimeout(timer);
}
timer = setTimeout(() => { // 초기설정 혹은 덮어쓰기
//API 요청
}, 400);
);
스로틀링 - 일정 시간이 지나기전에 다시 호출되지 않도록 하는것
let timer;
document.querySelector('#input').addEventListener('input', () =>
if (!timer) { // timer 없으면 실행
timer = setTimeout(() => {
timer = null; // 시간 지난 후 timer 해제
// timer 해제 후 API 요청
}, 400);
});
리액트 디바운싱 간단 구현
Parent.js
import { useState } from 'react';
// API
import { updateMemberById } from '../../lib/api/memberApi';
function parent() {
// 데이터 관리
const [memberState, setMemberState] = useState({
member: null,
});
const [timer, setTimer] = useState(0); // 디바운싱 타이머
const onChangeInputs = async evt => {
...
setMemberState({ // client data는 바로 변경
member: memberData,
});
...
// 디바운싱 - 마지막 호출만 적용 (put api)
if (timer) {
console.log('clear timer');
clearTimeout(timer);
}
const newTimer = setTimeout(async () => {
try {
await updateMemberById(match.params.id, memberData);
} catch (e) {
console.error('error', e);
}
}, 800);
setTimer(newTimer);
};
...
return (
<Child
onChangeInputs={onChangeInputs}
memberState={memberState}
/>
);
}