let isIdle: boolean = true
/**
-* Serially executes asynchronous functions.
-*/
+ * Serially executes asynchronous functions.
+ */
export async function enqueue<T> (task: () => Promise<T>): Promise<T> {
- const process = () => {
- const next = queue.shift()
- if (next == null) return isIdle = true
- const { task, resolve, reject } = next
- isIdle = !task
- task?.().then(resolve).catch(reject).finally(process)
- }
if (typeof task !== 'function') throw new TypeError('task is not a function')
- return new Promise<T>((resolve, reject) => {
+ return new Promise<T>((resolve, reject): void => {
queue.push({ task, resolve, reject })
if (isIdle) process()
})
}
+
+function process (): void {
+ const next = queue.shift()
+ if (next == null) {
+ isIdle = true
+ } else {
+ const { task, resolve, reject } = next
+ isIdle = !task
+ task?.().then(resolve).catch(reject).finally(process)
+ }
+}