Skip to content

Commit 3de1bac

Browse files
committed
feat: add resolve method for async computed
1 parent 00149b5 commit 3de1bac

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
},
@@ -1759,6 +1759,23 @@
17591759
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/ssr/ssr-types.ts",
17601760
"mdFile": "core.renderssroptions.md"
17611761
},
1762+
{
1763+
"name": "resolve",
1764+
"id": "asynccomputedreadonlysignal-resolve",
1765+
"hierarchy": [
1766+
{
1767+
"name": "AsyncComputedReadonlySignal",
1768+
"id": "asynccomputedreadonlysignal-resolve"
1769+
},
1770+
{
1771+
"name": "resolve",
1772+
"id": "asynccomputedreadonlysignal-resolve"
1773+
}
1774+
],
1775+
"kind": "MethodSignature",
1776+
"content": "```typescript\nresolve(): Promise<void>;\n```\n**Returns:**\n\nPromise&lt;void&gt;",
1777+
"mdFile": "core.asynccomputedreadonlysignal.resolve.md"
1778+
},
17621779
{
17631780
"name": "Resource",
17641781
"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
@@ -3591,6 +3609,16 @@ StreamWriter
35913609
35923610
[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/ssr/ssr-types.ts)
35933611
3612+
## resolve
3613+
3614+
```typescript
3615+
resolve(): Promise<void>;
3616+
```
3617+
3618+
**Returns:**
3619+
3620+
Promise&lt;void&gt;
3621+
35943622
## Resource
35953623
35963624
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)