디바운싱과 스로틀링.

디바운싱 - 제일 마지막(또는 처음) 호출만 적용하는 방식

notion image
let timer; document.querySelector('#input').addEventListener('input', () => if (timer) { // 이전 요청의 timer가 남아있다면 지우기 clearTimeout(timer); } timer = setTimeout(() => { // 초기설정 혹은 덮어쓰기 //API 요청 }, 400); );

스로틀링 - 일정 시간이 지나기전에 다시 호출되지 않도록 하는것

notion image
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} /> ); }
Child.js function child({ onChangeInputs, memberState }) { return ( <Input name="introduction" value={memberState.member.introduction} onChange={onChangeInputs} /> ) }
notion image