queue.ts 502 B

12345678910111213141516171819
  1. export class AsyncQueue<T> implements AsyncIterable<T> {
  2. private queue: T[] = []
  3. private resolvers: ((value: T) => void)[] = []
  4. push(item: T) {
  5. const resolve = this.resolvers.shift()
  6. if (resolve) resolve(item)
  7. else this.queue.push(item)
  8. }
  9. async next(): Promise<T> {
  10. if (this.queue.length > 0) return this.queue.shift()!
  11. return new Promise((resolve) => this.resolvers.push(resolve))
  12. }
  13. async *[Symbol.asyncIterator]() {
  14. while (true) yield await this.next()
  15. }
  16. }