Throttler
Runs tasks one at a time while keeping at least the configured interval between starts.
Use Throttler when every submitted task should run, but starts should be spaced over time. It does not drop intermediate calls.
Import
typescript
import { Duration } from '@haskou/value-objects';
import { ThrottleInterval, Throttler } from '@haskou/flow';Signature
typescript
class ThrottlerConstructor
typescript
constructor(interval: number | Duration | ThrottleInterval)Number inputs are interpreted as milliseconds.
Validation
The interval accepts a millisecond number, Duration, or ThrottleInterval. Internally, the interval is stored as ThrottleInterval.
Throws
This class can throw:
InvalidThrottlerIntervalError- any error thrown by a throttled task
Methods
| Method | Description |
|---|---|
run(task) | Queues a task and runs it when the throttle interval allows. |
waitUntilIdle() | Resolves when the internal queue is idle. |
Example
typescript
import { Throttler } from '@haskou/flow';
const throttler = new Throttler(Duration.fromMilliseconds(100));
await Promise.all([
throttler.run(() => callApi('a')),
throttler.run(() => callApi('b')),
]);
await throttler.waitUntilIdle();Notes
Throttleruses an internal one-at-a-time queue.- The first task runs immediately.
- Later tasks wait until the minimum interval has elapsed.
- The stored
ThrottleIntervalusesTimerDelayat the timer boundary. - Unlike
Debouncer, every task is eventually run unless its task rejects.