When using async/concurrent flows (streaming, dehydration/rehydration, optimistic updates), ensure you never persist “in-flight” async state and you always return promises from async callbacks.
1) Don’t persist promises during streaming/dehydration
<PersistQueryClientProvider
client={queryClient}
persistOptions={{
persister,
// Persist only queries that have resolved (not pending promises)
dehydrateOptions: { shouldDehydrateQuery: defaultShouldDehydrateQuery },
}}
>
{children}
</PersistQueryClientProvider>
2) Don’t drop promise lifecycles in concurrency callbacks
useMutation({
onSettled: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),
});
Practical checklist: