디바운스,쓰로틀

2024. 6. 12. 22:51· 프론트엔드/JS
목차
  1. ✅ 디바운스
  2. ✅ 스로틀

회사에서 순수js로 디바운스를 구현해야 하는 일이 생겼다.

프로젝트 내에 lodash를 여기저기 쓰고있어서 나는 디바운스 로직을 직접 구현하지 않고 편하게 쓰고있었다.

 

막상 직접 로직을 구현하려하니 많이 버벅였다.

라이브러리를 쓰기 전에 그 로직의 원리를 이해해야 하는데 라이브러리에 너무 기대고 있었던걸까

 

다시 기본을 다지도록


✅ 디바운스

1.개념 

: 여러번 발생하는 이벤트에서, 가장 마지막 이벤트 만을 실행되도록 제한함

 

2. 사용

: 사용자가 검색어를 입력할 때, 입력이 멈추면 서버에 요청을 보낼 때

: 버튼 연타시 불필요한 api호출을 막기 위해

 

3. 효과

: 불필요한 이벤트 핸들러의 실행을 줄일 수 있음

 

4. 내가 구현한 코드

- 버튼 클릭시 setTimeout함수가 반환한 Id를 Clear해서  setTimeout 로직 실행을 막는다.

- 제일 마지막 클릭시에만 setTimeout의 콜백함수 실행이 이뤄진다.

    const numberEl = document.querySelector(".countNum");
    const buttonEl = document.querySelector(".plus");

    // 디바운스 함수
    const debounce = (callbackFn, delay) => {
      let timerId; // 클로저

      return () => {
        if (timerId) {
          clearTimeout(timerId);
        }

        timerId = setTimeout(onClick, 500);
      };
    };

   // 클릭이벤트 함수
    const onClick = () => {
      const currentNum = +numberEl.innerText;
      numberEl.innerText = currentNum + 1;
    };

    buttonEl.addEventListener("click", debounce(onClick, 500));

 

5. 모범 코드

https://www.freecodecamp.org/korean/news/debounce-dibaunseu-javascripteseo-hamsureul-jiyeonsikineun-bangbeob-js-es6-yeje/

      const numberEl = document.querySelector(".countNum");
      const buttonEl = document.querySelector(".plus");

      function debounce(callbackFn, delay) {
        let timerId;
        return (...args) => {
          clearTimeout(timerId);
          timerId = setTimeout(() => {
            callbackFn.apply(this, args);
          }, delay);
        };
      }
      function onClick() {
        const currentNum = +numberEl.innerText;
        numberEl.innerText = currentNum + 1;
      }
      buttonEl.addEventListener("click", debounce(onClick, 500));

 

 

✅ 스로틀

1. 개념

: 여러번 발생하는 이벤트를 일정 시간 동안, 한번만 실행 되도록 제한한다.

 

2. 사용 

: 스크롤 이벤트, 마우스 이동 이벤트, 리사이즈와 같이 빈번하게 발생하는 이벤트를 처리할 때 유용 

 

3. 효과

: throttle을 사용하면 이벤트 핸들러가 너무 자주 실행되는 것을 방지하고, 성능 이슈를 줄일 수 있다.

 

4. 내가 구현한 코드

- 첫 클릭에만 setTimeout의 콜백함수가 실행되고, 0.5초 동안은 함수 실행이 무시된다.

- 이후 0.5초 뒤 첫 클릭시 다시 콜백함수가 실행된다.

      const numberEl = document.querySelector(".countNum");
      const buttonEl = document.querySelector(".plus");

      // 쓰로틀
      const throttle = (callbackFn, delay) => {
        let isWaiting = false;

        return () => {
          if (!isWaiting) {
            setTimeout(() => {
              callbackFn();
              isWaiting = false;
            }, delay);
          }

          isWaiting = true;
        };
      };

      // 클릭이벤트
      const onClick = () => {
        const currentNum = +numberEl.innerText;
        numberEl.innerHTML = currentNum + 1;
      };

      buttonEl.addEventListener("click", throttle(onClick, 1000));

 

 


https://pks2974.medium.com/throttle-%EC%99%80-debounce-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0-2335a9c426ff

'프론트엔드 > JS' 카테고리의 다른 글

동기 VS 비동기, Promise와 async/await  (0) 2024.11.24
문자열 정렬시 sort가 아닌 localeCompare메서드 사용  (0) 2024.08.10
URLSearchParams  (0) 2023.10.31
spread문법 , rest파라미터 , arguments의 차이  (0) 2023.07.25
parseInt, parseFloat, Math.floor 에 대해  (0) 2023.07.22
  1. ✅ 디바운스
  2. ✅ 스로틀
'프론트엔드/JS' 카테고리의 다른 글
  • 동기 VS 비동기, Promise와 async/await
  • 문자열 정렬시 sort가 아닌 localeCompare메서드 사용
  • URLSearchParams
  • spread문법 , rest파라미터 , arguments의 차이
journey-dev
journey-dev
journey-dev
journey-dev
journey-dev
전체
오늘
어제
  • 분류 전체보기 (63)
    • 프론트엔드 (44)
      • JS (8)
      • React (8)
      • vue (9)
      • Typescript (2)
    • CS (0)
      • 자료구조&알고리즘 (2)
      • 네트워크 (2)
    • 개발서적 (1)
      • 코어 자바스크립트 (0)
      • 프론트엔드 성능 최적화 가이드 (1)
    • DB (11)
      • SQL (11)
    • GIT (0)
    • GIS (3)
    • 개발일기 (0)
    • ing (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 일단 시작해라. 나중에 완벽해지면 된다.

인기 글

태그

  • 리액트 복기하기!

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
journey-dev
디바운스,쓰로틀
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.