Skip to content

Instantly share code, notes, and snippets.

@bendman
Created June 30, 2016 20:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bendman/1a6f15266209665332a490dcd2510ee9 to your computer and use it in GitHub Desktop.
Save bendman/1a6f15266209665332a490dcd2510ee9 to your computer and use it in GitHub Desktop.
Using generators and promises for more understandable async pipelines.
// This demo uses Babel for es2015 compilation and Promises, and superagent for requests.
// An example async pipeline, using a demo API
document.getElementById('run').addEventListener('click', (evt) => {
iteratePromises(function* () {
log('Requesting list of posts');
let postsResponse = yield superagent.get(
'http://jsonplaceholder.typicode.com/posts/');
log('Requesting author of first post');
let userResponse = yield superagent.get(
'http://jsonplaceholder.typicode.com/users/' + postsResponse.body[0].userId);
log('Post Author: ' + userResponse.body.name);
});
});
// This helper takes a generator and resolves each yielded promise in turn, passing
// each result back as the `yield` response.
function iteratePromises(Generate) {
let generator = Generate(); // store the iterable generator object
function iterate(yieldResponse) {
let iterated = generator.next(yieldResponse); // fire the next iterable step
if (!iterated.done && typeof iterated.value.then === 'function') {
// if the iterable yields a promise, wait for it to resolve and iterate again
iterated.value.then((response) => iterate(response));
}
}
iterate(); // kick off the generator
}
// A simple reverse-chronological logger
const log = (function (){
const logTarget = document.getElementById('log');
let logNumber = 1;
return function (msg) {
console.log(msg);
logTarget.innerHTML = logNumber++ + ' >> ' + msg + '\n' + logTarget.innerHTML;
};
}());
@bendman
Copy link
Author

bendman commented Jun 30, 2016

iteratePromises is a very simple implementation of Bluebird.coroutine, allowing async pipelines to be written using yield in a generator function.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment