rx-queue
Version:
Easy to Use ReactiveX Queue that Supports Delay/DelayExecutor/Throttle/Debounce/Concurrency Features Powered by RxJS/IxJS
61 lines (50 loc) • 1.23 kB
text/typescript
import type { Subscription } from 'rxjs'
import DelayQueue from './delay-queue.js'
export interface ExecutionUnit<T = unknown> {
fn : () => T,
name : string,
resolve : (value: T | PromiseLike<T>) => void,
reject : (e?: any) => void,
}
/**
* DelayQueueExecutor calls functions one by one with a delay time period between calls.
*/
export class DelayQueueExecutor<T = unknown> extends DelayQueue<ExecutionUnit<T>> {
private readonly delayQueueSubscription: Subscription
/**
*
* @param period milliseconds
*/
constructor (
period: number,
) {
super(period)
this.delayQueueSubscription = this.subscribe(unit => {
try {
const ret = unit.fn()
return unit.resolve(ret)
} catch (e) {
return unit.reject(e)
}
})
}
async execute (
fn: () => T,
name?: string,
): Promise<T> {
return new Promise<T>((resolve, reject) => {
const unit: ExecutionUnit<T> = {
fn,
name: name || fn.name,
reject,
resolve,
}
this.next(unit)
})
}
override unsubscribe () {
this.delayQueueSubscription.unsubscribe()
super.unsubscribe()
}
}
export default DelayQueueExecutor