Skip to content

Instantly share code, notes, and snippets.

@tuxracer
Created October 31, 2022 03:45
Show Gist options
  • Select an option

  • Save tuxracer/69b393151d55352b5f31e26daf3786f1 to your computer and use it in GitHub Desktop.

Select an option

Save tuxracer/69b393151d55352b5f31e26daf3786f1 to your computer and use it in GitHub Desktop.

Revisions

  1. tuxracer created this gist Oct 31, 2022.
    48 changes: 48 additions & 0 deletions queue.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,48 @@
    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;
    }
    }