diff --git a/packages/solid/src/reactive/signal.ts b/packages/solid/src/reactive/signal.ts index 8c842576a..803309c88 100644 --- a/packages/solid/src/reactive/signal.ts +++ b/packages/solid/src/reactive/signal.ts @@ -642,7 +642,9 @@ export function createResource( }, false); } else completeLoad(isSuccess, v); } - return v; + if (isSuccess) return v; + // TODO why aren't we rethrowing + return undefined; } function completeLoad(isSuccess: boolean, v: any) { runUpdates(() => { @@ -650,7 +652,7 @@ export function createResource( setPState(isSuccess ? 1 : 2); if (isSuccess) { setValue(() => v); - } else setError(v); + } else setError(() => v); for (const c of contexts.keys()) c.decrement!(); contexts.clear(); }, false); @@ -677,7 +679,6 @@ export function createResource( } function load(refetching: R | boolean = true) { if (refetching !== false && scheduled) return; - setPState(0); scheduled = false; const lookup = dynamic ? dynamic() : (source as S); loadedUnderTransition = Transition && Transition.running; @@ -701,13 +702,13 @@ export function createResource( } pr = p; if ("value" in p) { - if ((p as any).status === "success") loadEnd(pr, true, p.value, lookup); - else loadEnd(pr, false, p.value, lookup); + loadEnd(pr, (p as any).status === "success", p.value, lookup); return p; } scheduled = true; queueMicrotask(() => (scheduled = false)); runUpdates(() => { + setPState(0); setState(resolved ? "refreshing" : "pending"); trigger(); }, false); diff --git a/packages/solid/test/resource.spec.ts b/packages/solid/test/resource.spec.ts index ef0b5e447..35c4927a1 100644 --- a/packages/solid/test/resource.spec.ts +++ b/packages/solid/test/resource.spec.ts @@ -66,10 +66,14 @@ describe("Simulate a dynamic fetch", () => { expect(value.error).toBeUndefined(); reject("Because I said so"); await Promise.resolve(); - expect(error).toBeInstanceOf(Error); - expect(error.message).toBe("Because I said so"); - expect(value.error).toBeInstanceOf(Error); - expect(value.error.message).toBe("Because I said so"); + // expect(error).toBeInstanceOf(Error); + // expect(error.message).toBe("Because I said so"); + // expect(value.error).toBeInstanceOf(Error); + // expect(value.error.message).toBe("Because I said so"); + expect(error).toBeTypeOf("string"); + expect(error).toBe("Because I said so"); + expect(value.error).toBeTypeOf("string"); + expect(value.error).toBe("Because I said so"); expect(value.loading).toBe(false); }); }); @@ -204,7 +208,7 @@ describe("using Resource with errors", () => { reject(null); await Promise.resolve(); expect(value.state === "errored").toBe(true); - expect(value.error.message).toBe("Unknown error"); + expect(value.error).toBeNull(); }); });