Skip to content

Commit 4cd7eb1

Browse files
authored
fix: catch synchronous error (#2476)
1 parent 84ca952 commit 4cd7eb1

File tree

3 files changed

+43
-7
lines changed

3 files changed

+43
-7
lines changed

.changeset/chilled-buttons-hammer.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"solid-js": patch
3+
---
4+
5+
Catch synchronous errors in `createResource`.

packages/solid/src/reactive/signal.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -695,16 +695,24 @@ export function createResource<T, S, R>(
695695
return;
696696
}
697697
if (Transition && pr) Transition.promises.delete(pr);
698+
let error: unknown;
698699
const p =
699700
initP !== NO_INIT
700701
? (initP as T | Promise<T>)
701-
: untrack(() =>
702-
fetcher(lookup, {
703-
value: value(),
704-
refetching
705-
})
706-
);
707-
if (!isPromise(p)) {
702+
: untrack(() => {
703+
try {
704+
return fetcher(lookup, {
705+
value: value(),
706+
refetching
707+
});
708+
} catch (fetcherError) {
709+
error = fetcherError;
710+
}
711+
});
712+
if (error !== undefined) {
713+
loadEnd(pr, undefined, castError(error), lookup);
714+
return;
715+
} else if (!isPromise(p)) {
708716
loadEnd(pr, p, undefined, lookup);
709717
return p;
710718
}

packages/solid/test/resource.spec.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,29 @@ describe("using Resource with errors", () => {
211211
});
212212
});
213213

214+
describe("using Resource with synchronous error", () => {
215+
let value: Resource<number | undefined>;
216+
let error: Error;
217+
test("catches the error", async () => {
218+
createRoot(() => {
219+
catchError(
220+
() => {
221+
[value] = createResource(() => {
222+
throw new Error("Fetcher error");
223+
});
224+
createRenderEffect(value);
225+
},
226+
e => {
227+
error = e;
228+
}
229+
);
230+
});
231+
expect(value.state === "errored").toBe(true);
232+
expect(value.error).toBe(error);
233+
expect(value.error.message).toBe("Fetcher error");
234+
});
235+
});
236+
214237
describe("using Resource with custom store", () => {
215238
type User = {
216239
firstName: string;

0 commit comments

Comments
 (0)