frontPanel/src/utils/requestQueue.ts

36 lines
778 B
TypeScript
Raw Normal View History

2023-11-27 23:07:24 +00:00
export class RequestQueue<T = unknown> {
2023-12-31 02:53:25 +00:00
private pendingPromise = false;
private items: Array<{
action: () => Promise<T>;
resolve: (value: T) => void;
reject: (reason?: any) => void;
}> = [];
2023-12-31 02:53:25 +00:00
enqueue(action: () => Promise<T>) {
return new Promise((resolve, reject) => {
this.items.push({ action, resolve, reject });
this.dequeue();
});
}
2023-12-31 02:53:25 +00:00
async dequeue() {
if (this.pendingPromise) return;
2023-12-31 02:53:25 +00:00
const item = this.items.shift();
if (!item) return;
2023-12-31 02:53:25 +00:00
try {
this.pendingPromise = true;
const payload = await item.action();
this.pendingPromise = false;
2023-12-31 02:53:25 +00:00
item.resolve(payload);
} catch (e) {
this.pendingPromise = false;
item.reject(e);
} finally {
this.dequeue();
}
2023-12-31 02:53:25 +00:00
}
}