4 Commits

Author SHA1 Message Date
Kristaps Fabians Geikins abe8089fdd fix: making sure tryFirstResolve/reject are always invoked 2022-11-15 17:26:09 +02:00
Kristaps Fabians Geikins 773260b97e Merge pull request #1 from fabis94/v4
onServerPrefetchFix move to new fork
2022-11-15 16:59:31 +02:00
Kristaps Fabians Geikins 9830ea7607 fix: onServerPrefetch promise refactor 2022-11-11 12:31:50 +02:00
Kristaps Fabians Geikins 7e06de77aa fix: onServerPrefetch getting stuck prevention 2022-11-11 12:29:16 +02:00
2 changed files with 33 additions and 14 deletions
+33 -14
View File
@@ -170,20 +170,45 @@ export function useQueryImpl<
// SSR // SSR
let firstResolve: (() => void) | undefined let firstResolve: (() => void) | undefined
let firstResolveTriggered = false
let firstReject: ((apolloError: ApolloError) => void) | undefined 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
stop()
}
vm && onServerPrefetch?.(() => { vm && onServerPrefetch?.(() => {
if (!isEnabled.value || (isServer && currentOptions.value?.prefetch === false)) return if (!isEnabled.value || (isServer && currentOptions.value?.prefetch === false)) return
return new Promise<void>((resolve, reject) => { return new Promise<void>((resolve, reject) => {
firstResolve = () => { firstResolve = () => {
resetFirstResolveReject()
resolve() resolve()
firstResolve = undefined
firstReject = undefined
} }
firstReject = (apolloError: ApolloError) => { firstReject = (apolloError: ApolloError) => {
resetFirstResolveReject()
reject(apolloError) reject(apolloError)
firstResolve = undefined }
firstReject = undefined
if (firstResolveTriggered) {
firstResolve()
} else if (firstRejectError) {
firstReject(firstRejectError)
} }
}).then(stop).catch(stop) }).then(stop).catch(stop)
}) })
@@ -205,7 +230,7 @@ export function useQueryImpl<
started || !isEnabled.value || started || !isEnabled.value ||
(isServer && currentOptions.value?.prefetch === false) (isServer && currentOptions.value?.prefetch === false)
) { ) {
if (firstResolve) firstResolve() tryFirstResolve()
return return
} }
@@ -259,10 +284,7 @@ export function useQueryImpl<
processError(resultErrorsToApolloError(queryResult.errors)) processError(resultErrorsToApolloError(queryResult.errors))
} }
if (firstResolve) { tryFirstResolve()
firstResolve()
stop()
}
} }
function processNextResult (queryResult: ApolloQueryResult<TResult>) { function processNextResult (queryResult: ApolloQueryResult<TResult>) {
@@ -282,10 +304,7 @@ export function useQueryImpl<
processNextResult((query.value as ObservableQuery<TResult, TVariables>).getCurrentResult()) processNextResult((query.value as ObservableQuery<TResult, TVariables>).getCurrentResult())
} }
processError(apolloError) processError(apolloError)
if (firstReject) { tryFirstReject(apolloError)
firstReject(apolloError)
stop()
}
// The observable closes the sub if an error occurs // The observable closes the sub if an error occurs
resubscribeToQuery() resubscribeToQuery()
} }
@@ -312,7 +331,7 @@ export function useQueryImpl<
* Stop watching the query * Stop watching the query
*/ */
function stop () { function stop () {
if (firstResolve) firstResolve() tryFirstResolve()
if (!started) return if (!started) return
started = false started = false
loading.value = false loading.value = false