Skip to content

Instantly share code, notes, and snippets.

@esmevane
Created April 2, 2016 17:30
Show Gist options
  • Save esmevane/b9e98eb683a6d76452800b67c4679a7a to your computer and use it in GitHub Desktop.
Save esmevane/b9e98eb683a6d76452800b67c4679a7a to your computer and use it in GitHub Desktop.
[ Generators / Promises / Javascript / ES6 ]: Running generators synchronously in JS
function run(generator) {
let progress = generator()
let step = progress.next()
const iterate = (progress, { done, value }) => {
const isArrayValue = Array.isArray(value)
const invoke = (value) => {
let complete = new Promise(resolve => {
iterate(progress, progress.next(value)).then(resolve)
})
return complete
}
if (done) { return Promise.resolve(value) }
return isArrayValue ? Promise.all(value.map(invoke)) : invoke(value)
}
iterate(progress, step)
}
const delay = (ms, phrase) => {
return new Promise(resolve => setTimeout(() => console.log(phrase), ms))
}
run(function* () {
yield [
delay(100, "Heyyyyyy"),
delay(200, "Youuuuu"),
delay(300, "Guuuuyyyyyyyyyyyyys")
]
yield delay(100, "Ha ha ha!")
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment