Created
December 14, 2014 17:11
-
-
Save kl0tl/4c4982756c1ce67ea97d to your computer and use it in GitHub Desktop.
ES7 async functions with ES6 generators and promises
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
/* | |
ES7 | |
``` | |
async function f() { | |
await ... | |
} | |
``` | |
ES6 | |
``` | |
const f = async(function* () { | |
yield ... | |
}); | |
``` | |
*/ | |
function async(f) { | |
return function () { | |
let generator = f.apply(this, arguments); | |
return new Promise((resolve, reject) => { | |
let onValue = generator.next.bind(generator); | |
let onError = generator.throw.bind(generator); | |
(function step(callback) { | |
let next; | |
try { | |
next = callback(); | |
} catch (err) { | |
return reject(err); | |
} | |
if (next.done) resolve(next.value); | |
else if (next.value && next.value.then) Promise.resolve(next.value) | |
.then((value) => step(() => onValue(value)), (err) => step(() => onError(err))); | |
else step(() => onValue(value)); | |
}(onValue)); | |
}); | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment