const master = new class { constructor() { this.done = false; this.listeners = []; } async* makeGenerator(filterCallback) { while (true) { const {element, resolve} = await new Promise((resolve, reject) => { this.listeners.push(resolve); }); if (element === null) { resolve(); break; } if (filterCallback(element)) { yield Promise.resolve(element); } resolve(); } } subscribe(element) { const promise = Promise.all(this.listeners.map(listener => { return new Promise(resolve => { listener({element, resolve}); }); })); this.listeners = []; return promise; } complete() { this.subscribe(null); } }(); for (let space of ["a", "b"]) { (async function () { const result = []; console.log("start", space); for await (let object of master.makeGenerator(element => element.char === space)) { console.log("space", object); result.push(object); } console.log("end", space); console.log(result); })(); } console.log('test'); const data = [ 1, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 1, 2, 1, 2, ].map((number, index) => ({char: number === 1 ? "a" : "b", index})); (async function () { for (let element of data) { console.log("element", element); await master.subscribe(element); } master.complete(); })();