함수: asyncThrottle()
function asyncThrottle<TFn>(fn, initialOptions): (...args) => Promise<Awaited<ReturnType<TFn>> | undefined>;
정의 위치: async-throttler.ts:628
함수의 실행 빈도를 제한하는 비동기 스로틀 함수를 생성합니다. 스로틀 함수는 여러 번 호출되어도 대기 시간마다 최대 한 번 실행됩니다. 실행 중에 호출하면 실행이 완료될 때까지 기다린 뒤 다음 호출을 예약합니다.
비동기 버전과 동기 버전: 비동기 버전은 동기 스로틀 함수보다 다음과 같은 고급 기능을 제공합니다.
- 스로틀 함수 결과를 기다릴 수 있는 프로미스를 반환합니다.
- AsyncRetryer 통합을 통한 내장 재시도 기능을 제공합니다.
- 진행 중인 실행을 취소하는 중단 기능을 제공합니다.
- 대기 중인 실행의 시작을 막는 취소 기능을 제공합니다.
- onError 콜백과 throwOnError 제어를 통한 포괄적인 오류 처리를 제공합니다.
- 세부 실행 정보(성공/오류/완료 횟수)를 추적합니다.
- 진행 중인 실행이 완료된 후 다음 실행을 예약합니다.
비동기 기능, 반환값 또는 실행 제어가 필요하지 않다면 동기 스로틀 함수가 더 가볍고 간단합니다.
스로틀링이란? 스로틀링은 지정된 시간 윈도우 안에서 한 번의 실행만 허용해 함수 실행 빈도를 제한합니다. 호출할 때마다 지연 타이머를 초기화하는 디바운싱과 달리 스로틀링은 호출 빈도와 관계없이 함수가 일정한 간격으로 실행되도록 합니다.
설정 옵션:
wait: 함수를 한 번만 실행할 수 있는 시간 윈도우(밀리초, 필수)leading: 호출 시 즉시 실행할지 여부(기본값: true)trailing: 대기 시간의 후행 에지에서 실행할지 여부(기본값: true)enabled: 스로틀러 활성화 여부(기본값: true)asyncRetryerOptions: 실행의 재시도 동작 설정
오류 처리:
onError핸들러를 제공하면 오류 및 스로틀러 인스턴스와 함께 호출됩니다.throwOnError가 true이면(onError 핸들러가 없을 때의 기본값) 오류가 발생합니다.throwOnError가 false이면(onError 핸들러가 있을 때의 기본값) 오류가 처리된 것으로 간주됩니다.- onError와 throwOnError를 함께 사용할 수 있으며 오류가 발생하기 전에 핸들러가 호출됩니다.
- 내부 AsyncThrottler 인스턴스를 사용해 오류 상태를 확인할 수 있습니다.
상태 관리:
- 반응형 상태 관리에 TanStack Store를 사용합니다.
- 비동기 스로틀러 생성 시
initialState로 초기 상태 값을 제공합니다. onSuccess콜백으로 성공한 함수 실행에 반응하고 사용자 지정 로직을 구현합니다.onError콜백으로 함수 실행 오류에 반응하고 사용자 지정 오류 처리를 구현합니다.onSettled콜백으로 함수 실행 완료(성공 또는 오류)에 반응하고 사용자 지정 로직을 구현합니다.- 상태에는 오류 횟수, 실행 상태, 마지막 실행 시간, 성공/완료 횟수가 포함됩니다.
- 내부 AsyncThrottler 인스턴스의
store.state속성으로 상태에 접근할 수 있습니다. - 프레임워크 어댑터(React/Solid)를 사용할 때는 훅의 state 속성에서 상태에 접근합니다.
타입 매개변수
TFn
TFn extends AnyAsyncFunction
매개변수
fn
TFn
initialOptions
AsyncThrottlerOptions<TFn>
반환값
(...args): Promise<Awaited<ReturnType<TFn>> | undefined>;
스로틀 함수 실행을 시도합니다. 실행 동작은 스로틀러 옵션에 따라 달라집니다.
-
마지막 실행 후 충분한 시간이 지난 경우(>= 대기 시간):
- leading=true: 즉시 실행합니다.
- leading=false: 다음 후행 실행을 기다립니다.
-
대기 시간 안인 경우:
- trailing=true: 대기 시간이 끝날 때 실행하도록 예약합니다.
- trailing=false: 실행을 버립니다.
매개변수
args
...Parameters<TFn>
반환값
Promise<Awaited<ReturnType<TFn>> | undefined>
예시
const throttled = new AsyncThrottler(fn, { wait: 1000 });
// First call executes immediately
await throttled.maybeExecute('a', 'b');
// Call during wait period - gets throttled
await throttled.maybeExecute('c', 'd');
예시
const throttled = asyncThrottle(async (value: string) => {
const result = await saveToAPI(value);
return result; // Return value is preserved
}, {
wait: 1000,
onError: (error) => {
console.error('API call failed:', error);
}
});
// This will execute at most once per second
// Returns the API response directly
const result = await throttled(inputElement.value);