ComputerScience/JavaScript
[JavaScript] Throttle
kyungmin.yu
2021. 4. 10. 18:19
이 개념도 책(Do it 리액트 프로그래밍 정석)에서 본 내용인데
Throttle이란 개념은 Debounce(include-note.tistory.com/entry/JavaScript-Debounce)와 유사하지만
입력되는 동안 이전에 요청했던 작업들이 주기적으로 실행된다는 점이 다르다.
Throttle의 경우 명령이 동작하고 있는 도중에 새 명령이 들어오는 경우 새 명령을 무시하도록 구현하면 된다.
이 개념이 주로 사용되는 App은 Facebook이다. Facebook의 경우 아래로 스크롤될 때 스크롤되는 동안 새로운 페이지가 계속해서 로드되는 것을 볼 수 있다. 만약 Throttle이 아닌 Debounce라는 개념이 적용되었다면 스크롤이 멈추기 전까지는 새로운 페이지가 로드되지 않는 문제가 발생할 수 있다.
Throttle을 이용하여 스크롤 시 페이지를 계속 업데이트하는 로직은 아래와 같이 구현할 수 있다.
function throttle(func, delay) {
let lastFunc;
let lastRan;
return function(...args) {
const context = this;
if (!lastRan) {
func.call(context, ...args);
lastRan = Date.now();
} else {
if (lastFunc) {
clearTimeout(lastFunc);
}
lastFunc = setTimeout(function() {
if (delay - (Date.now() - lastRan)) {
func.call(context, ...args);
lastRan = Date.now();
}
}), delay - (Date.now() - lastRan);
}
}
}
var checkPos = () => {
const offset = 500;
const curScrollPos = window.pageYOffset;
const pageBottomPos = document.body.offsetHeight - window.innerHeight - offset;
if (curScrollPos >= pageBottomPos) {
// reload
console.log("load next page");
}
};
var infiniteScroll = throttle(checkPos, 300);
window.addEventListener('scroll', infiniteScroll);