Skip to content

withTimeout

비동기 함수에 시간 제한을 걸어서, 지정된 시간 내에 완료되지 않으면 TimeoutError를 발생시켜요.

typescript
await withTimeout(run, ms);

레퍼런스

withTimeout(run, ms)

비동기 작업에 타임아웃을 설정하고 싶을 때 withTimeout을 사용하세요. Promise가 지정된 시간 내에 완료되지 않으면 TimeoutError로 거부되어서, 무한정 기다리는 상황을 방지할 수 있어요.

typescript
import { withTimeout } from 'es-toolkit/promise';

async function fetchData() {
  const response = await fetch('https://api.example.com/data');
  return response.json();
}

try {
  // 1초 내에 완료되어야 해요
  const data = await withTimeout(fetchData, 1000);
  console.log('데이터를 받았어요:', data);
} catch (error) {
  if (error.name === 'TimeoutError') {
    console.log('요청 시간이 초과되었어요');
  }
}

데이터베이스 쿼리에 시간 제한을 걸고 싶을 때도 사용할 수 있어요.

typescript
async function queryDatabase(query: string) {
  // 데이터베이스 쿼리 로직
  return await db.execute(query);
}

try {
  const result = await withTimeout(
    () => queryDatabase('SELECT * FROM users'),
    5000 // 5초 제한
  );
  console.log('쿼리 결과:', result);
} catch (error) {
  console.log('쿼리가 너무 오래 걸려서 취소되었어요');
}

여러 API 호출 중에서 가장 빠른 응답만 받고 싶은 경우에도 활용할 수 있어요.

typescript
async function getFastestResponse() {
  const apis = [() => fetch('/api/server1'), () => fetch('/api/server2'), () => fetch('/api/server3')];

  try {
    // 각 API에 2초 제한을 걸고 가장 빨리 응답하는 것만 받아요
    const promises = apis.map(api => withTimeout(api, 2000));
    const result = await Promise.race(promises);
    return result.json();
  } catch (error) {
    console.log('모든 API가 시간 초과되었어요');
  }
}

파라미터

  • run (() => Promise<T>): 실행할 비동기 함수예요.
  • ms (number): 타임아웃이 발생하기까지의 밀리초 단위 시간이에요.

반환 값

(Promise<T>): 주어진 비동기 함수가 반환하는 결과이거나, 시간 초과 시 TimeoutError로 거부되는 Promise를 반환해요.

에러

지정된 시간 내에 완료되지 않으면 TimeoutError를 던져요.

MIT 라이선스에 따라 배포됩니다.