From 7e06de77aab33505165aab9d519b1de32a4a711e Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Fri, 11 Nov 2022 12:29:16 +0200 Subject: [PATCH 1/2] fix: onServerPrefetch getting stuck prevention --- .../vue-apollo-composable/src/useQuery.ts | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/packages/vue-apollo-composable/src/useQuery.ts b/packages/vue-apollo-composable/src/useQuery.ts index e9b70e4..70bf01a 100644 --- a/packages/vue-apollo-composable/src/useQuery.ts +++ b/packages/vue-apollo-composable/src/useQuery.ts @@ -170,20 +170,41 @@ export function useQueryImpl< // SSR let firstResolve: (() => void) | undefined + let firstResolveTriggered = false let firstReject: ((apolloError: ApolloError) => void) | undefined + let firstRejectError: undefined | ApolloError + + const tryFirstResolve = () => { + firstResolveTriggered = true + if (firstResolve) firstResolve() + } + + const tryFirstReject = (apolloError: ApolloError) => { + firstRejectError = apolloError + if (firstReject) firstReject(apolloError) + } + + const resetFirstResolveReject = () => { + firstResolve = undefined + firstReject = undefined + firstResolveTriggered = false + firstRejectError = undefined + } + vm && onServerPrefetch?.(() => { if (!isEnabled.value || (isServer && currentOptions.value?.prefetch === false)) return return new Promise((resolve, reject) => { + if (firstResolveTriggered) return + if (firstRejectError) throw firstRejectError + firstResolve = () => { resolve() - firstResolve = undefined - firstReject = undefined + resetFirstResolveReject() } firstReject = (apolloError: ApolloError) => { reject(apolloError) - firstResolve = undefined - firstReject = undefined + resetFirstResolveReject() } }).then(stop).catch(stop) }) @@ -205,7 +226,7 @@ export function useQueryImpl< started || !isEnabled.value || (isServer && currentOptions.value?.prefetch === false) ) { - if (firstResolve) firstResolve() + tryFirstResolve() return } @@ -260,7 +281,7 @@ export function useQueryImpl< } if (firstResolve) { - firstResolve() + tryFirstResolve() stop() } } @@ -283,7 +304,7 @@ export function useQueryImpl< } processError(apolloError) if (firstReject) { - firstReject(apolloError) + tryFirstReject(apolloError) stop() } // The observable closes the sub if an error occurs @@ -312,7 +333,7 @@ export function useQueryImpl< * Stop watching the query */ function stop () { - if (firstResolve) firstResolve() + tryFirstResolve() if (!started) return started = false loading.value = false From 9830ea76077a52b2b4f69c074270c42e55581bb4 Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Fri, 11 Nov 2022 12:31:50 +0200 Subject: [PATCH 2/2] fix: onServerPrefetch promise refactor --- packages/vue-apollo-composable/src/useQuery.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/vue-apollo-composable/src/useQuery.ts b/packages/vue-apollo-composable/src/useQuery.ts index 70bf01a..25ceccd 100644 --- a/packages/vue-apollo-composable/src/useQuery.ts +++ b/packages/vue-apollo-composable/src/useQuery.ts @@ -195,9 +195,6 @@ export function useQueryImpl< if (!isEnabled.value || (isServer && currentOptions.value?.prefetch === false)) return return new Promise((resolve, reject) => { - if (firstResolveTriggered) return - if (firstRejectError) throw firstRejectError - firstResolve = () => { resolve() resetFirstResolveReject() @@ -206,6 +203,12 @@ export function useQueryImpl< reject(apolloError) resetFirstResolveReject() } + + if (firstResolveTriggered) { + firstResolve() + } else if (firstRejectError) { + firstReject(firstRejectError) + } }).then(stop).catch(stop) })