Skip to content

Instantly share code, notes, and snippets.

@jooyunghan
Created December 20, 2017 15:51
Show Gist options
  • Save jooyunghan/d33d302a076a750eeabe0a6713e087a1 to your computer and use it in GitHub Desktop.
Save jooyunghan/d33d302a076a750eeabe0a6713e087a1 to your computer and use it in GitHub Desktop.
function createAsyncIterator() {
const promises = [];
const values = [];
let done = false;
const subscription = this.subscribe({
next(value) {
if (promises.length > 0) {
promises.shift().resolve({ value, done: false });
} else {
values.push(value);
}
},
complete() {
done = true;
promises.splice(0).forEach(p => p.resolve({ done }));
}
});
return {
next() {
if (values.length > 0) {
return { value: values.shift(), done: false };
}
if (done) {
return { done };
}
return new Promise((resolve, reject) => {
promises.push({ resolve, reject });
});
},
return() {
subscription.unsubscribe();
}
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment