--- 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 { 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 ```