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