Skip to content

Instantly share code, notes, and snippets.

@chrisyip
Last active August 29, 2015 14:02
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 chrisyip/dcd15d3d5244f827c82c to your computer and use it in GitHub Desktop.
Save chrisyip/dcd15d3d5244f827c82c to your computer and use it in GitHub Desktop.
Promise with ES6 generator
// https://www.promisejs.org/generators/
function async(makeGenerator) {
return function () {
var generator = makeGenerator.apply(this, arguments);
function handle(result){
if (result.done) return Promise.resolve(result.value);
return Promise.resolve(result.value).then(function (res){
return handle(generator.next(res));
}, function (err){
return handle(generator.throw(err));
});
}
try {
return handle(generator.next());
} catch (ex) {
return Promise.reject(ex);
}
}
}
// A better promisifiled generator runner
// Support yielding promises and generators, like co (https://www.npmjs.com/package/co)
function runGenerator (makeGenerator) {
return function (thisArg, args) {
var generator = makeGenerator.apply(thisArg, args)
function handle (result, gen) {
var value = result.value
if (value != null) {
if (value.constructor.name === 'GeneratorFunctionPrototype') {
value = handle(value.next(), value)
} else if (value.constructor.name === 'GeneratorFunction') {
value = runGenerator(value)(thisArg, args)
}
}
if (result.done) {
return Promise.resolve(value)
}
return Promise.resolve(value).then(function (res) {
return handle(gen.next(res), gen)
}, function (err){
return handle(gen.throw(err), gen)
})
}
try {
return handle(generator.next(), generator)
} catch (ex) {
return Promise.reject(ex)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment