Skip to content

Instantly share code, notes, and snippets.

@jooyunghan
Created December 20, 2017 16:03
Show Gist options
  • Save jooyunghan/72157ea47e07e7e546e58bbdf7fcdf2c to your computer and use it in GitHub Desktop.
Save jooyunghan/72157ea47e07e7e546e58bbdf7fcdf2c to your computer and use it in GitHub Desktop.
function createAsyncIterator() {
const promises = [];
const values = [];
let done = false;
let error = null;
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 }));
},
error(err) {
error = err;
promises.splice(0).forEach(p => p.reject(err));
}
});
return {
next() {
if (values.length > 0) {
return { value: values.shift(), done: false };
}
if (done) {
return { done };
}
if (error) {
return Promise.reject(error);
}
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