Created
June 30, 2016 20:48
-
-
Save bendman/1a6f15266209665332a490dcd2510ee9 to your computer and use it in GitHub Desktop.
Using generators and promises for more understandable async pipelines.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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; | |
}; | |
}()); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
iteratePromises
is a very simple implementation ofBluebird.coroutine
, allowing async pipelines to be written usingyield
in a generator function.