Today in order to use a generator function in a resolver I do -
const co = require('co');
const resolvers = {
Query: {
things: (_, params, context) => co(function * () {
// consider db.getThings is a generator function
return yield db.getThings(params, context);
}),
}
Is there a different way to do this ? (I repeat this a lot)
Any sense in making resolvers support generator functions (or async) for compatibility ?
Thanks
@avnersorek
Query: {
async things(_, params, context) {
const elements = await db.getThings()
return elements
}
Thanks @Rennos
So this is expected to work with async but not with generators ?
This does not work for me :
Query: {
things: function * () {
const elements = yield db.getThings();
return elements; // elements is undefined
}
}
It does not work with generators 'out of the box'.
I ran my resolvers through this function which wraps the generators using co -
function applyCoToGeneratorResolvers(resolvers) {
const fixedResolvers = {};
Object.keys(resolvers).forEach(resolverName => {
const resolver = resolvers[resolverName];
if (!_.isFunction(resolver)) {
fixedResolvers[resolverName] = applyCoToGeneratorResolvers(resolver);
} else if ('GeneratorFunction' === resolver.constructor.name || 'GeneratorFunction' === resolver.constructor.displayName) {
fixedResolvers[resolverName] = co.wrap(resolver);
} else {
fixedResolvers[resolverName] = resolver;
}
});
return fixedResolvers;
}
Most helpful comment
@avnersorek