브라우저가 유휴 상태(idle)일 때 실행할 콜백을 예약할 수 있는 메서드.
이 메서드를 사용하면 브라우저 메인 스레드가 바쁠 때는 해당 작업을 연기하고, 한가할 때 수행할 수 있다. 따라서 우선순위가 낮은 백그라운드 작업을 수행할 때 유용하다.
var handle = window.requestIdleCallback(callback[, options])
callback
: 유휴 상태에 호출할 함수. IdleDeadline
객체를 인수로 받음options
: 옵셔널 매개변수. 콜백이 반드시 호출되어야 하는 최대 시간을 나타내는 timeout
속성을 가짐callback 함수에게 전달되는 객체로, 다음과 같이 구성됩니다.
timeRemaining()
: 브라우저가 다음 작업을 실행하기 전까지 얼만큼의 시간이 남았는지를 밀리초 단위로 반환didTimeout
: 브라우저가 아직 유휴 상태가 되지 않았지만, 설정한 timeout 시간이 지나 콜백이 호출되었음을 나타내는 boolean 값기존에는 필수적이지 않은 작업을 추후에 실행되도록 개발자가 직접 예약하는 것이 매우 번거로웠지만, 브라우저는 언제 유휴 상태가 되는지 알고 있기 때문에 requestIdleCallback
라는 API가 등장하게 되었다.
요즘 웹사이트에서는 실행해야 할 스크립트가 매우 많다. 그래서 스크립트를 최대한 빨리 실행해야 하지만, 동시에 메인 스레드를 오래 점유하여 사용자에게 방해가 되지 않도록 하는 것이 중요하다. 따라서 자바스크립트의 실행에 있어서 최적화가 필요한 경우 requestIdleCallback
을 사용하면 좋다.
유휴 상태에 실행할 콜백 함수를 requestIdleCallback
에게 넘겨주면 된다.
function myNonEssentialWork(deadline) {
// 유휴 시간 동안 실행하기
while (deadline.timeRemaining() > 0 && tasks.length > 0) {
doWorkIfNeeded();
}
if (tasks.length > 0) {
// 해야 할 일이 남았다면
requestIdleCallback(myNonEssentialWork); // 다음 유휴 때 마저 실행하기
}
}
requestIdleCallback(myNonEssentialWork);
단, 브라우저가 매우 바쁜 상황이라면 콜백이 호출되기 까지 오랜 시간이 걸릴 수 있다.
나중에 실행되어도 괜찮지만, 특정 시간 안에는 실행됐으면 하는 상황이라면 timeout
옵션을 주어 해결할 수 있다.
requestIdleCallback(processPendingAnalyticsEvents, { timeout: 2000 });
2초라는 시간이 지나서 콜백이 실행되면, deadline
객체는 다음과 같이 구성된다.
timeRemaining()
은 0
을 반환함didTimeout
은 true
가 됨단, timeout 옵션을 주는 것은 사용자에게 중단이 발생(버벅거림)할 수 있어 주의가 필요하다. 가능하다면 브라우저가 콜백을 호출할 시점을 결정하도록 놔두는 것이 좋다.
이 메서드는 실험적 기능으로, 현재 대부분의 브라우저에서 지원하지만 Safari(iOS)에서는 지원되지 않는다.
따라서 메서드의 사용 가능 여부를 확인한 다음, 지원하지 않는다면 환경이라면 setTimeout으로 직접 구현하거나 폴리필을 사용해야 한다
if ("requestIdleCallback" in window) {
// Use requestIdleCallback to schedule work.
} else {
// Do what you’d do today.
}