- setTimeout
- delay 시간 후에 단 한번 동작하는 타이머를 생성한다
const timeoutId = setTimeout(func|code[,delay, param1, param2,...]);
- func : 타이머가 만료된 뒤 호출될 콜백 함수
- delay: delay시간만큼 지연된 후 동작하는 타이머를 생성
- param1:콜백 함수에 전달해야할 인수가 존재할 경우 전달
//1초뒤에 실행
setTimeout(()=>console.log('hi'),1000);
setTimeout(name=>console.log(`hi! ${name}.`),1000, 'Lee');
- clearTimeout: 호출 스케쥴링을 취소한다
//setTimeout함수는 생성된 타이머를 식별할 수 있는 고유한 타이머 id를 반환
const timerId=setTimeout(()=>console.log('hi'),1000);
clearTimeout(timerId);
- setInterval
- delay 시간만큼 반복동작하는 타이머 생성
- 타이머가 취소될 때까지 계속된다
let count = 1;
//clearInterval 타이머id를 통해 타이머를 취소 할 수 있다
const timeoutId = setInterval(() => {
console.log(count);
if (count++ === 5) clearInterval(timeoutId);
}, 1000)
- 디바운스(debounce)
- 짧은 시간 간격으로 발생하는 이벤트를 그룹화하여 마지막에 한번만 이벤트 핸들러가 실행되게 함
- 쇼핑몰 연관 검색어 추천에서 사용됨
- Underscore의 debounce함수나 Lodash의 debounce함수를 추천
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="text">
<div class="msg"></div>
<script>
const $input = document.querySelector('input');
const $msg = document.querySelector('.msg');
//debounce 함수는 tiemrId를 기억하는 클로저 반환
const debounce = (callback, delay )=>{
let timerId;
return event =>{
if(timerId) clearTimeout(timerId)
timerId=setTimeout(callback, delay, event)
}
}
//debounce 함수가 반환하는 클로저가 이벤트 핸들러로 등록된다
//300ms보다 짧은 간격으로 input 이벤트가 발생하면 호출 안하고
//300ms동안 이벤트가 더이상 발생하지 않으면 한 번만 호출된다
$input.oninput= debounce(e=>{
$msg.textContent = e.target.value;
}, 300)
</script>
</body>
</html>
- 스로틀(throttle)
-
이벤트가 연속적으로 일어나도 일정 시간 간격으로 이벤트 핸들러 최대 한번 호출
-
무한 스크롤 UI 이벤트 구현에 유용하게 사용됨
<!DOCTYPE html> <html lang="en"> <head> <style> .container { width: 300px; height: 300px; background-color: rebeccapurple; overflow: scroll; } .content { width: 300px; height: 1000vh; } </style> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div class="container"> <div class="content"></div> </div> <div> 일반 이벤트 핸들러 scroll 이벤트 처리 횟수: <span class="normal-count">0</span> </div> <div> 스크롤 이벤트 핸들러 scroll 이벤트 처리 횟수: <span class="throttle-count">0</span> </div> <script> const $container = document.querySelector('.container'); const $normalCount = document.querySelector('.normal-count'); const $throttleCount = document.querySelector('.throttle-count'); const throttle = (callback, delay) =>{ let timerId; return event => { if(timerId) return; timerId = setTimeout(()=>{ callback(event); timerId = null; }, delay, event) } } let normalCount = 0 ; $container.addEventListener('scroll', ()=>{ $normalCount.textContent = ++normalCount; }) let throttleCount = 0; $container.addEventListener('scroll', throttle(()=>{ $throttleCount.textContent = ++throttleCount; }, 100)) </script> </body> </html>
-