From d384cacced5f162548a2e399ee043b80125ab6fe Mon Sep 17 00:00:00 2001 From: Aryan Deora Date: Mon, 15 Apr 2024 00:22:11 -0400 Subject: [PATCH] fix(solid-query): Resolve resource before unmounting query (#7279) --- packages/solid-query/src/createBaseQuery.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/solid-query/src/createBaseQuery.ts b/packages/solid-query/src/createBaseQuery.ts index 202265fc32..8b4876df15 100644 --- a/packages/solid-query/src/createBaseQuery.ts +++ b/packages/solid-query/src/createBaseQuery.ts @@ -236,10 +236,19 @@ export function createBaseQuery< */ let unsubscribe: (() => void) | null = null + /* + Fixes #7275 + In a few cases, the observer could unmount before the resource is loaded. + This leads to Suspense boundaries to be suspended indefinitely. + This resolver will be called when the observer is unmounting + but the resource is still in a loading state + */ + let resolver: ((value: ResourceData) => void) | null = null const [queryResource, { refetch }] = createResource( () => { const obs = observer() return new Promise((resolve, reject) => { + resolver = resolve if (isServer) { unsubscribe = createServerSubscriber(resolve, reject) } else if (!unsubscribe && !isRestoring()) { @@ -261,6 +270,7 @@ export function createBaseQuery< } if (!observerResult.isLoading) { const query = obs.getCurrentQuery() + resolver = null return resolve(hydratableObserverResult(query, observerResult)) } @@ -354,6 +364,10 @@ export function createBaseQuery< unsubscribe() unsubscribe = null } + if (resolver && !isServer) { + resolver(observerResult) + resolver = null + } }) createComputed(