Promise.race로 실행 시간 제한 걸기
dev | 2024-09-22
동시에 여러개의 비동기 처리를 할 때 Promise.all
을 사용해서 처리 속도를 올리곤 한다.
const results = await Promise.all([fetchData1(), fetchData2()]);
이렇게 하면 데이터 패칭을 동시에 요청하고 병렬로 둘 다 끝난 후에 results
에 [data1, data2]
와 같이 데이터가 들어간다.
반면에 Promise.race
를 사용하면 모든 처리가 끝날 때 까지 기다리지 않고 먼저 끝나는 것이 반환되어서 일종의 타임아웃을 걸 수 있다.
await Promise.race([
page.waitForNetworkIdle(),
new Promise(resolve => setTimeout(resolve, 5000)),
]);
이렇게 하면 네트워크 활동이 끝나거나 5초가 지나거나 둘 중에 먼저 끝나는 것이 반환되어서 네트워크 활동이 5초 이상 지연될 경우에도 더이상 기다리지 않고 다음으로 넘어가게 할 수 있다.
반환값을 사용하지 않거나 거부되는 상황이 중요하지 않다면 Promise.any
도 사용할 수 있다. Promise.race
는 먼저 거부되는게 있으면 거부된 결과를 반환하는데 비해 Promise.any
는 거부된 결과는 무시하고 해결된 결과가 나올때 반환을 한다. 빈 배열을 전달하면 Promise.race
는 계속 기다리지만 Promise.any
는 거부된 결과를 반환하며 바로 종료된다.
Promise.all
도 거부냐 해결이냐에 따라서 동작이 약간 다른 Promise.allSettled
가 있는데 Promise.all
은 거부가 발행하면 이를 반환하며 대기가 끝나지만 Promise.allSettled
는 거부냐 해결이냐에 상관없이 모든 결과를 기다린다. Promise.allSettled
는 나중에 추가된 스펙이어서 지금까지는 원래 하던대로 Promise.all
만 사용하고 있었는데 여러 데이터를 불러오는 작업은 서로 의존성이 없기 때문에 Promise.allSettled
가 더 적절해 보인다. Promise.allSettled
를 쓰면 실패하는 것이 있어도 나머지 성공한 결과를 사용할 수 있기 때문에 유용할 때가 있다.
Comments