12주차 주간 공부 내용 - JS 비동기 프로그래밍, 타이머

잔잔바리디자이너·2022년 5월 27일
0

Study

목록 보기
18/19

타이머와 비동기 프로그래밍

타이머

  • 함수는 호출하는 즉시 실행된다. 만약 함수 호출을 일정 시간이 지난 뒤 호출되도록 예약하려면 타이머 함수를 사용한다. 이를 호출 스케줄링이라 한다.
  • 브라우저 환경과 Node.js 환경에서 모두 전역 객체의 메서드로서 타이머 함수를 제공한다. 즉 타이머 함수는 호스트 객체이다.

호스트 객체?

자바스크립트 엔진은 코드를 실행 전에 전역 객체를 먼저 생성한다. 이 객체는 최상위 객체이다. 브라우저상에서는 window가 전역객체를 가리킨다. 전역 객체는 표준 빌트인 객체, 환경에 따른 호스트 객체, 그리고 var 키워드로 선언한 전역 변수와 함수를 프로퍼티로 갖는다.

호스트 객체: 브라우저 환경에서는 DOM, BOM, XMLHttpRequest 등 클라이언트 사이드 Web PAI를 호스트 객체로 제공한다.

타이머 함수

setTimeout / clearTimeout

setTimeout 함수는 인수로 전달 받은 시간으로 단 한번 동작하는 타이머를 생성한다. 타이머가 만료되면 인수로 전달받은 콜백 함수를 호출한다.

setTimeout 매개변수

setTimeout(func, delay, param1, param2, ...)

func:
타이머가 만료된 뒤 호출될 콜백 함수
delay:
타이머 만료 시간(ms단위) 인수 전달을 생략한 경우 기본값 0
delay가 4ms 이하인 경우 최소 지연 시간 4ms가 저장된다.
❗️ 타이머가 만료되면 콜백 함수가 즉시 호출되는 것이 보장되지 않는다. 딜레이 시간은 태스크 큐에 콜백 함수를 등록하는 시간을 지연할 뿐이다.
param:
호출 스케줄링된 콜백 함수에 전달해야 할 인수가 있는 경우 세번째 이후의 인수로 전달 가능하다.

setTimeout 함수는 생성된 타이머를 식별할 수 있는 고유한 타이머 id를 반환한다. 브라우저의 경우 숫자이다. 이 id를 clearTimeout 함수의 인수로 전달하여 타이머를 취소할 수 있다.

const timerId = setTimeout(name => console.log(name),3000,'kim')
/// 3초 뒤에 setTimeout의 콜백 함수가 실행되지 않는다.
clearTimeout(timerId)

setInterval / clearInterval

setInterval 함수는 인수로 전달받은 시간으로 반복 동작하는 타이머를 생성한다. 이는 타이머가 취소될 때 까지 계속된다. 함수에 전달할 인수는 setTimeout과 동일하다.
마찬가지로 clearInterval 함수에 setInterval 함수가 반환한 타이머 id를 전달하여 함수 호출 스케줄링을 취소한다.

let x = 10;

const timerId = setInterval(()=>{
    console.log(x)
    if(x++ === 20)clearInterval(timerId)
},1000)

/*
10
11
.
.
.
20
*/

디바운스와 스로틀

디바운스

scroll, resize, input등의 이벤트는 짧은 시간 간격으로 연속해서 발생한다. 이벤트 핸들러가 과도하게 호출되면 성능에 문제를 일으킬 수 있다. 디바운스는 이벤트가 연속해서 발생할 때 핸들러를 호출하지 않다가 일정 시간이 지난 후 이벤트 핸들러가 한 번만 호출되게 한다.

즉 이벤트를 그룹화 해서 마지막에 한 번만 호출되도록 한다. 입력 필드에서 input 이벤트가 발생하는 경우에 사용 가능하다. 디바운스를 구현하기 위해서 타이머 함수가 활용된다.

디바운스 구현 해보기 (보류)

요구사항
1. input 검색창에 검색어 입력시 관련 결과가 하단에 보여짐
2. 대소문자 구분 없이 결과 보여주기
3. JSON 데이터 활용, ajax 요청 보내기
4. 이벤트 발생 디바운싱으로 관리하기

참고:

  1. https://www.zerocho.com/category/JavaScript/post/59a8e9cb15ac0000182794fa
  2. https://programming119.tistory.com/241
  3. https://velog.io/@1703979/JS-30-06

0개의 댓글