붉은거위 노트 (redgoose note)

비동기함수 타임아웃 처리하기

Nest
Development
Category
Javascript
Hit
220
Star
0

axios 에서는 기본적으로 타임아웃 기능이 제공되어 있지만 다른 모듈에서 타임아웃 기능이 없기 때문에 직접 만들어 써야한다.

Promise부분에서 괜찮은 기능을 찾아서 적용해보니 타임아웃에 딱 알맞다.
그래서 함수로 정리..

/**
 * request with timeout
 *
 * @param {Promise[]|Promise} queue
 * @param {number} timeout
 * @return {Promise<any>}
 */
function requestWithTimeout(queue, timeout = 3000)
{
  if (!(Array.isArray(queue) && queue.length > 0)) queue = [ queue ]
  return Promise.race([
    ...queue,
    new Promise((_, reject) => setTimeout(() => reject(new Error('Request timeout')), timeout)),
  ])
}

기본적인 사용법은 다음과 같다.

await requestWithTimeout([
  queue1,
  queue2,
], 3000)

배열에 있는 비동기들에서 가장먼저 응답이 오면 사용되기 때문에 여러개 요청들을 묶어서 타임아웃을 걸어야 하는 상황이라면 Promise.all을 활용하는 방법도 있다.

await requestWithTimeout([
  Promise.all([ queue1, queue2 ])
], 3000)

참고
https://stackoverflow.com/a/49857905