--- category: Watch --- # until Promised one-time watch for changes ## Usage #### Wait for some async data to be ready ```ts import { until, useAsyncState } from '@vueuse/core'; const { state, isReady } = useAsyncState( fetch('https://jsonplaceholder.typicode.com/todos/1').then((t) => t.json()), {}, ); (async () => { await until(isReady).toBe(true); console.log(state); // state is now ready! })(); ``` #### Wait for custom conditions > You can use `invoke` to call the async function. ```ts import { invoke, until, useCounter } from '@vueuse/core'; const { count } = useCounter(); invoke(async () => { await until(count).toMatch((v) => v > 7); alert('Counter is now larger than 7!'); }); ``` #### Timeout ```ts import { until } from '@vueuse/core'; // ---cut--- // will be resolve until ref.value === true or 1000ms passed await until(ref).toBe(true, { timeout: 1000 }); // will throw if timeout try { await until(ref).toBe(true, { timeout: 1000, throwOnTimeout: true }); // ref.value === true } catch (e) { // timeout } ``` #### More Examples ```ts import { until } from '@vueuse/core'; // ---cut--- await until(ref).toBe(true); await until(ref).toMatch((v) => v > 10 && v < 100); await until(ref).changed(); await until(ref).changedTimes(10); await until(ref).toBeTruthy(); await until(ref).toBeNull(); await until(ref).not.toBeNull(); await until(ref).not.toBeTruthy(); ``` ## Type Declarations ````ts export interface UntilToMatchOptions { /** * Milliseconds timeout for promise to resolve/reject if the when condition does not meet. * 0 for never timed out * * @default 0 */ timeout?: number; /** * Reject the promise when timeout * * @default false */ throwOnTimeout?: boolean; /** * `flush` option for internal watch * * @default 'sync' */ flush?: WatchOptionFlush; /** * `deep` option for internal watch * * @default 'false' */ deep?: WatchOptions['deep']; } export interface UntilBaseInstance { toMatch: (( condition: (v: T) => v is U, options?: UntilToMatchOptions, ) => Not extends true ? Promise> : Promise) & ((condition: (v: T) => boolean, options?: UntilToMatchOptions) => Promise); changed: (options?: UntilToMatchOptions) => Promise; changedTimes: (n?: number, options?: UntilToMatchOptions) => Promise; } type Falsy = false | void | null | undefined | 0 | 0n | ''; export interface UntilValueInstance extends UntilBaseInstance< T, Not > { readonly not: UntilValueInstance; toBe:

( value: MaybeRefOrGetter

, options?: UntilToMatchOptions, ) => Not extends true ? Promise : Promise

; toBeTruthy: ( options?: UntilToMatchOptions, ) => Not extends true ? Promise : Promise>; toBeNull: ( options?: UntilToMatchOptions, ) => Not extends true ? Promise> : Promise; toBeUndefined: ( options?: UntilToMatchOptions, ) => Not extends true ? Promise> : Promise; toBeNaN: (options?: UntilToMatchOptions) => Promise; } export interface UntilArrayInstance extends UntilBaseInstance { readonly not: UntilArrayInstance; toContains: ( value: MaybeRefOrGetter>>, options?: UntilToMatchOptions, ) => Promise; } /** * Promised one-time watch for changes * * @see https://vueuse.org/until * @example * ``` * const { count } = useCounter() * * await until(count).toMatch(v => v > 7) * * alert('Counter is now larger than 7!') * ``` */ export declare function until( r: WatchSource | MaybeRefOrGetter, ): UntilArrayInstance; export declare function until(r: WatchSource | MaybeRefOrGetter): UntilValueInstance; ````