Skip to content

Commit a715fa1

Browse files
authored
chore: tweak resource implementation (#17123)
* chore: tweak resource implementation * fn, fn * tweak
1 parent eca531f commit a715fa1

File tree

1 file changed

+12
-34
lines changed
  • packages/svelte/src/internal/client/reactivity

1 file changed

+12
-34
lines changed

packages/svelte/src/internal/client/reactivity/resource.js

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ export function resource(fn) {
1919

2020
/**
2121
* @template T
22-
* @implements {Partial<Promise<Awaited<T>>>}
22+
* @implements {Partial<Promise<T>>}
2323
*/
2424
class Resource {
2525
#init = false;
2626

27-
/** @type {() => T} */
27+
/** @type {() => T | Promise<T>} */
2828
#fn;
2929

3030
/** @type {Source<boolean>} */
@@ -36,42 +36,19 @@ class Resource {
3636
/** @type {Source<boolean>} */
3737
#ready = state(false);
3838

39-
/** @type {Source<Awaited<T> | undefined>} */
39+
/** @type {Source<T | undefined>} */
4040
#raw = state(undefined);
4141

42-
/** @type {Source<Promise<any>>} */
42+
/** @type {Source<Promise<T>>} */
4343
#promise;
4444

45-
/** @type {Derived<Awaited<T> | undefined>} */
46-
#current = derived(() => {
47-
if (!get(this.#ready)) return undefined;
48-
return get(this.#raw);
49-
});
50-
5145
/** {@type Source<any>} */
5246
#error = state(undefined);
5347

54-
/** @type {Derived<Promise<Awaited<T>>['then']>} */
55-
// @ts-expect-error - I feel this might actually be incorrect but I can't prove it yet.
56-
// we are technically not returning a promise that resolves to the correct type... but it _is_ a promise that resolves at the correct time
48+
/** @type {Derived<Promise<T>['then']>} */
5749
#then = derived(() => {
5850
const p = get(this.#promise);
59-
60-
return async (resolve, reject) => {
61-
const result = /** @type {Promise<Awaited<T>>} */ (
62-
(async () => {
63-
await p;
64-
await tick();
65-
return get(this.#current);
66-
})()
67-
);
68-
69-
if (resolve || reject) {
70-
return result.then(resolve, reject);
71-
}
72-
73-
return result;
74-
};
51+
return (resolve, reject) => p.then(resolve, reject);
7552
});
7653

7754
/**
@@ -92,6 +69,7 @@ class Resource {
9269
this.#init = true;
9370
}
9471

72+
/** @type {ReturnType<typeof deferred<T>>} */
9573
const { resolve, reject, promise } = deferred();
9674

9775
this.#latest.push(resolve);
@@ -108,7 +86,7 @@ class Resource {
10886
set(this.#raw, value);
10987
set(this.#error, undefined);
11088

111-
resolve(undefined);
89+
resolve(value);
11290
})
11391
.catch((e) => {
11492
const idx = this.#latest.indexOf(resolve);
@@ -137,12 +115,12 @@ class Resource {
137115
get finally() {
138116
get(this.#then);
139117
return (/** @type {any} */ fn) => {
140-
return get(this.#then)().finally(fn);
118+
return get(this.#then)(fn, fn);
141119
};
142120
}
143121

144122
get current() {
145-
return get(this.#current);
123+
return get(this.#ready) ? get(this.#raw) : undefined;
146124
}
147125

148126
get error() {
@@ -173,13 +151,13 @@ class Resource {
173151
};
174152

175153
/**
176-
* @param {Awaited<T>} value
154+
* @param {T} value
177155
*/
178156
set = (value) => {
179157
set(this.#ready, true);
180158
set(this.#loading, false);
181159
set(this.#error, undefined);
182160
set(this.#raw, value);
183-
set(this.#promise, Promise.resolve());
161+
set(this.#promise, Promise.resolve(value));
184162
};
185163
}

0 commit comments

Comments
 (0)