Skip to content

Instantly share code, notes, and snippets.

@tuxracer
Created October 31, 2022 03:45
Show Gist options
  • Save tuxracer/69b393151d55352b5f31e26daf3786f1 to your computer and use it in GitHub Desktop.
Save tuxracer/69b393151d55352b5f31e26daf3786f1 to your computer and use it in GitHub Desktop.
export default class Queue {
private static queue: {
promise: () => Promise<unknown>;
resolve: (value: unknown) => void;
reject: (err: unknown) => void;
}[] = [];
private static isWorkingOnItemInQueue = false;
static enqueue<T>(promise: () => Promise<T>) {
return new Promise((resolve, reject) => {
this.queue.push({
promise,
resolve,
reject,
});
this.dequeue();
});
}
static dequeue() {
if (this.isWorkingOnItemInQueue) {
return false;
}
const item = this.queue.shift();
if (!item) {
return false;
}
try {
this.isWorkingOnItemInQueue = true;
item.promise()
.then((value) => {
this.isWorkingOnItemInQueue = false;
item.resolve(value);
this.dequeue();
})
.catch((err) => {
this.isWorkingOnItemInQueue = false;
item.reject(err);
this.dequeue();
});
} catch (err) {
this.isWorkingOnItemInQueue = false;
item.reject(err);
this.dequeue();
}
return true;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment