Polling
Client 가 일정시간 내에 데이터를 얻기 위해 Request 를 Server 에 보내는 기술
const poll = async ({ fn, validate, interval, maxAttempts }) => {
let attempts = 0;
const executePoll = async (resolve, reject) => {
const result = await fn();
attempts++;
if (validate(result)) {
return resolve(result);
} else if (maxAttempts && attempts === maxAttempts) {
return reject(new Error('Exceeded max attempts'));
} else {
setTimeout(executePoll, interval, resolve, reject);
}
};
return new Promise(executePoll);
};
poll
함수는 함수를 반환하는 고차 함수
executePoll
는 Promise
을 반환하고 중지 조건이 충족될 때까지 재귀적으로 실행
poll
함수의 인수 네가지
fn
: 주어진 간격으로 실행할 함수(일반적으로 API 요청)validate
: 이것은 또한 데이터가 우리가 원하는 것과 일치하는지 확인하기 위해 테스트를 정의하여 투표를 종료하는 기능이기도 합니다. 예를 들어 데이터가 존재하는지 간단히 테스트하거나 응답의 중첩된 속성이 특정 상태에 도달했는지 확인interval
: 폴링 요청 사이에 대기하려는 시간maxAttempts
: 최대 폴링 요청 수 설정API를 폴링한 횟수를 추적하기 위해 클로저를 형성하는 attempts
변수를 선언
excutePoll
함수를 선언하여 프로미스를 반환
executePoll
을 재귀적으로 계속 호출하고 유효한 값에 도달할 때까지만 resolve
반환되면 attempts
를 증가
fn
에서 가져온 result
에 대해 validate
를 호출하고, 그 결과가 true
이면 값을 성공적으로 resolve
결과가 유효하지 않은 경우 최대 폴링 시도 횟수에 도달했는지 확인하고 그렇다면 오류를 throw
그렇지 않으면 지정된 interval
에 대한 setTimeout
을 호출한 후 함수를 재귀적으로 호출하여 폴링을 다시 시도
Reference