Skip to content

Commit

Permalink
feat(Collector): allow collectors to be consumed by for-await-of loops (
Browse files Browse the repository at this point in the history
  • Loading branch information
bdistin authored and SpaceEEC committed Aug 17, 2019
1 parent 7fae6e5 commit 6d3c55b
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/structures/interfaces/Collector.js
Expand Up @@ -196,6 +196,37 @@ class Collector extends EventEmitter {
if (reason) this.stop(reason);
}

/**
* Allows collectors to be consumed with for-await-of loops
* @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of}
*/
async *[Symbol.asyncIterator]() {
const queue = [];
const onCollect = item => queue.push(item);
this.on('collect', onCollect);

try {
while (queue.length || !this.ended) {
if (queue.length) {
yield queue.shift();
} else {
// eslint-disable-next-line no-await-in-loop
await new Promise(resolve => {
const tick = () => {
this.off('collect', tick);
this.off('end', tick);
return resolve();
};
this.on('collect', tick);
this.on('end', tick);
});
}
}
} finally {
this.off('collect', onCollect);
}
}

toJSON() {
return Util.flatten(this);
}
Expand Down
1 change: 1 addition & 0 deletions typings/index.d.ts
Expand Up @@ -363,6 +363,7 @@ declare module 'discord.js' {
public handleCollect(...args: any[]): void;
public handleDispose(...args: any[]): void;
public stop(reason?: string): void;
public [Symbol.asyncIterator](): AsyncIterableIterator<V>;
public toJSON(): object;

protected listener: Function;
Expand Down

0 comments on commit 6d3c55b

Please sign in to comment.