Using next.js example api-routes-apollo-server-and-client. When I'm trying to implement delay in apollo/resolvers.js
this way:
export const resolvers = {
Query: {
viewer (_parent, _args, _context, _info) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({ id: 1, name: 'John Smith', status: 'cached' });
}, 1000);
})
}
}
}
This doesn't work in SSR. The data is empty in the SSR apollo state but user data expected { id: 1, name: 'John Smith', status: 'cached' }
.
I'm using that also with sequelize to fetch the data from database and it doesn't work too. I guess the reason is the same.
Maybe I'm doing something wrong.
Client-side part works fine (data are displayed after React hydratation).
If we're doing static object instead of Promise:
export const resolvers = {
Query: {
viewer (_parent, _args, _context, _info) {
return { id: 1, name: 'John Smith', status: 'cached' };
}
}
}
Everything works fine and this puts object to initial state returned from SSR server with correct static markup...
What am I expecting?
I want just server render graphql requiest, finish promises, the put the data to apollo state for SSR and does the SSR for SEO purposes. Because for now if I connect to the database - it doesn't work at all (nothing's rendered. just empty page because rendering was interrupted by something).
async
functions return a promise so the caller has to useawait
or.then()
to get the value from the returned promise. Also,return await new Promise()
does nothing useful overreturn new Promise()
. And, in fact, your function doesn't even need to beasync
as it finds no benefit from that either. – jfriend00apollo/resolvers.js
with contents I sent in the question and try to run. After you run it and disable javascript you'll see that there are no server-side rendered contents after gql query execution. – featureoffutureasync
function or a function that returns a promise. That example is a synchronous resolver. You cannot EVER get a synchronous result out ofasync
function or out of a promise or any function that obtains its result asynchronously. Can't be done in Javascript. The caller must useawait
or.then()
to get the value out of the promise. – jfriend00Promise.resolve(...data)
) – featureoffuture