비동기함수 타임아웃 처리하기
- Nest
- Development
- Category
- Javascript
- Hit
- 352
- 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)