Skip to content

Commit c599807

Browse files
committed
implement settled
1 parent 693262a commit c599807

File tree

5 files changed

+22
-3
lines changed

5 files changed

+22
-3
lines changed

packages/svelte/src/index-client.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,5 +241,5 @@ function init_update_callbacks(context) {
241241
export { flushSync } from './internal/client/runtime.js';
242242
export { getContext, getAllContexts, hasContext, setContext } from './internal/client/context.js';
243243
export { hydrate, mount, unmount } from './internal/client/render.js';
244-
export { tick, untrack } from './internal/client/runtime.js';
244+
export { tick, untrack, settled } from './internal/client/runtime.js';
245245
export { createRawSnippet } from './internal/client/dom/blocks/snippet.js';

packages/svelte/src/index-server.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ export function unmount() {
3535

3636
export async function tick() {}
3737

38+
export async function settled() {}
39+
3840
/** @type {AbortController | null} */
3941
let controller = null;
4042

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ export class Batch {
3939

4040
#pending = 0;
4141

42+
/** @type {PromiseWithResolvers<void> | null} */
43+
deferred = null;
44+
4245
/** @type {Effect[]} */
4346
async_effects = [];
4447

@@ -51,8 +54,6 @@ export class Batch {
5154
/** @type {Set<Effect>} */
5255
skipped_effects = new Set();
5356

54-
apply() {}
55-
5657
/**
5758
*
5859
* @param {Effect[]} root_effects
@@ -93,6 +94,8 @@ export class Batch {
9394

9495
flush_queued_effects(render_effects);
9596
flush_queued_effects(effects);
97+
98+
this.deferred?.resolve();
9699
} else {
97100
for (const e of this.render_effects) set_signal_status(e, CLEAN);
98101
for (const e of this.effects) set_signal_status(e, CLEAN);

packages/svelte/src/internal/client/runtime.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -884,6 +884,15 @@ export async function tick() {
884884
flushSync();
885885
}
886886

887+
/**
888+
* Returns a promise that resolves once any state changes, and asynchronous work resulting from them,
889+
* have resolved and the DOM has been updated
890+
* @returns {Promise<void>}
891+
*/
892+
export function settled() {
893+
return (Batch.ensure().deferred ??= Promise.withResolvers()).promise;
894+
}
895+
887896
/**
888897
* @template V
889898
* @param {Value<V>} signal

packages/svelte/types/index.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,11 @@ declare module 'svelte' {
452452
* Returns a promise that resolves once any pending state changes have been applied.
453453
* */
454454
export function tick(): Promise<void>;
455+
/**
456+
* Returns a promise that resolves once any state changes, and asynchronous work resulting from them,
457+
* have resolved and the DOM has been updated
458+
* */
459+
export function settled(): Promise<void>;
455460
/**
456461
* When used inside a [`$derived`](https://svelte.dev/docs/svelte/$derived) or [`$effect`](https://svelte.dev/docs/svelte/$effect),
457462
* any state read inside `fn` will not be treated as a dependency.

0 commit comments

Comments
 (0)