Skip to content

Commit 21b9c14

Browse files
committed
feat: add resolve method for async computed
1 parent 870a90a commit 21b9c14

File tree

5 files changed

+74
-2
lines changed

5 files changed

+74
-2
lines changed

packages/docs/src/routes/api/qwik/api.json

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@
244244
}
245245
],
246246
"kind": "Interface",
247-
"content": "```typescript\nexport interface AsyncComputedReadonlySignal<T = unknown> extends ComputedSignal<T> \n```\n**Extends:** [ComputedSignal](#computedsignal)<!-- -->&lt;T&gt;\n\n\n<table><thead><tr><th>\n\nProperty\n\n\n</th><th>\n\nModifiers\n\n\n</th><th>\n\nType\n\n\n</th><th>\n\nDescription\n\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[error](#)\n\n\n</td><td>\n\n\n</td><td>\n\nError \\| null\n\n\n</td><td>\n\nThe error that occurred while computing the signal.\n\n\n</td></tr>\n<tr><td>\n\n[loading](#)\n\n\n</td><td>\n\n\n</td><td>\n\nboolean\n\n\n</td><td>\n\nWhether the signal is currently loading.\n\n\n</td></tr>\n</tbody></table>",
247+
"content": "```typescript\nexport interface AsyncComputedReadonlySignal<T = unknown> extends ComputedSignal<T> \n```\n**Extends:** [ComputedSignal](#computedsignal)<!-- -->&lt;T&gt;\n\n\n<table><thead><tr><th>\n\nProperty\n\n\n</th><th>\n\nModifiers\n\n\n</th><th>\n\nType\n\n\n</th><th>\n\nDescription\n\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[error](#)\n\n\n</td><td>\n\n\n</td><td>\n\nError \\| null\n\n\n</td><td>\n\nThe error that occurred while computing the signal.\n\n\n</td></tr>\n<tr><td>\n\n[loading](#)\n\n\n</td><td>\n\n\n</td><td>\n\nboolean\n\n\n</td><td>\n\nWhether the signal is currently loading.\n\n\n</td></tr>\n</tbody></table>\n\n\n<table><thead><tr><th>\n\nMethod\n\n\n</th><th>\n\nDescription\n\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[resolve()](#asynccomputedreadonlysignal-resolve)\n\n\n</td><td>\n\n\n</td></tr>\n</tbody></table>",
248248
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/reactive-primitives/signal.public.ts",
249249
"mdFile": "core.asynccomputedreadonlysignal.md"
250250
},
@@ -1745,6 +1745,23 @@
17451745
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/ssr/ssr-types.ts",
17461746
"mdFile": "core.renderssroptions.md"
17471747
},
1748+
{
1749+
"name": "resolve",
1750+
"id": "asynccomputedreadonlysignal-resolve",
1751+
"hierarchy": [
1752+
{
1753+
"name": "AsyncComputedReadonlySignal",
1754+
"id": "asynccomputedreadonlysignal-resolve"
1755+
},
1756+
{
1757+
"name": "resolve",
1758+
"id": "asynccomputedreadonlysignal-resolve"
1759+
}
1760+
],
1761+
"kind": "MethodSignature",
1762+
"content": "```typescript\nresolve(): Promise<void>;\n```\n**Returns:**\n\nPromise&lt;void&gt;",
1763+
"mdFile": "core.asynccomputedreadonlysignal.resolve.md"
1764+
},
17481765
{
17491766
"name": "Resource",
17501767
"id": "resource",

packages/docs/src/routes/api/qwik/index.mdx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,24 @@ Whether the signal is currently loading.
185185
</td></tr>
186186
</tbody></table>
187187
188+
<table><thead><tr><th>
189+
190+
Method
191+
192+
</th><th>
193+
194+
Description
195+
196+
</th></tr></thead>
197+
<tbody><tr><td>
198+
199+
[resolve()](#asynccomputedreadonlysignal-resolve)
200+
201+
</td><td>
202+
203+
</td></tr>
204+
</tbody></table>
205+
188206
[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/reactive-primitives/signal.public.ts)
189207
190208
## AsyncComputedReturnType
@@ -3469,6 +3487,16 @@ StreamWriter
34693487
34703488
[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/ssr/ssr-types.ts)
34713489
3490+
## resolve
3491+
3492+
```typescript
3493+
resolve(): Promise<void>;
3494+
```
3495+
3496+
**Returns:**
3497+
3498+
Promise&lt;void&gt;
3499+
34723500
## Resource
34733501
34743502
This method works like an async memoized function that runs whenever some tracked value changes and returns some data.

packages/qwik/src/core/reactive-primitives/impl/async-computed-signal-impl.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { qwikDebugToString } from '../../debug';
22
import type { Container } from '../../shared/types';
3-
import { isPromise } from '../../shared/utils/promises';
3+
import { isPromise, retryOnPromise } from '../../shared/utils/promises';
44
import { cleanupFn, trackFn } from '../../use/utils/tracker';
55
import type { BackRef } from '../cleanup';
66
import { AsyncComputeQRL, SerializationSignalFlags, EffectSubscription } from '../types';
@@ -103,6 +103,10 @@ export class AsyncComputedSignalImpl<T>
103103
this.$promiseValue$ = NEEDS_COMPUTATION;
104104
}
105105

106+
async resolve(): Promise<void> {
107+
await retryOnPromise(() => this.$computeIfNeeded$());
108+
}
109+
106110
$computeIfNeeded$() {
107111
if (!(this.$flags$ & SignalFlags.INVALID)) {
108112
return;

packages/qwik/src/core/reactive-primitives/signal.public.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface AsyncComputedReadonlySignal<T = unknown> extends ComputedSignal
2121
loading: boolean;
2222
/** The error that occurred while computing the signal. */
2323
error: Error | null;
24+
resolve(): Promise<void>;
2425
}
2526

2627
/**

packages/qwik/src/core/tests/use-async-computed.spec.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,4 +216,26 @@ describe.each([
216216
);
217217
});
218218
});
219+
220+
describe('resolve', () => {
221+
it('should not rerun if resolve is used before', async () => {
222+
(globalThis as any).log = [];
223+
const Counter = component$(() => {
224+
const count = useSignal(1);
225+
const doubleCount = useAsyncComputed$(() => Promise.resolve(count.value * 2));
226+
227+
useTask$(async () => {
228+
await doubleCount.resolve();
229+
(globalThis as any).log.push('task');
230+
(globalThis as any).log.push(doubleCount.value);
231+
});
232+
233+
return <div></div>;
234+
});
235+
await render(<Counter />, { debug });
236+
expect((globalThis as any).log).toEqual(['task', 2]);
237+
238+
(globalThis as any).log = undefined;
239+
});
240+
});
219241
});

0 commit comments

Comments
 (0)