--- category: '@RxJS' --- # watchExtractedObservable Watch the values of an RxJS [`Observable`](https://rxjs.dev/guide/observable) as extracted from one or more composables. Automatically unsubscribe on observable change, and automatically unsubscribe from it when the component is unmounted. Supports all overloads of [`watch`](https://vuejs.org/guide/essentials/watchers.html#basic-example). ## Usage ```ts no-twoslash import { watchExtractedObservable } from '@vueuse/rxjs'; import { computed, reactive, useTemplateRef } from 'vue'; import { AudioPlayer } from '../my/libs/AudioPlayer'; // setup() const audio = useTemplateRef('audio'); const player = computed(() => (audio.value ? new AudioPlayer(audio.value) : null)); const state = reactive({ progress: 0, }); watchExtractedObservable( player, (p) => p.progress$, (percentage) => { state.progress = percentage * 100; }, ); ``` If you want to add custom error handling to an `Observable` that might error, you can supply an optional `onError` configuration. Without this, RxJS will treat any error in the supplied `Observable` as an "unhandled error" and it will be thrown in a new call stack and reported to `window.onerror` (or `process.on('error')` if you happen to be in Node). You can also supply an optional `onComplete` configuration if you need to attach special behavior when the watched observable completes. ```ts no-twoslash import { watchExtractedObservable } from '@vueuse/rxjs'; import { computed, reactive, useTemplateRef } from 'vue'; import { AudioPlayer } from '../my/libs/AudioPlayer'; // setup() const audio = useTemplateRef('audio'); const player = computed(() => (audio.value ? new AudioPlayer(audio.value) : null)); const state = reactive({ progress: 0, }); watchExtractedObservable( player, (p) => p.progress$, (percentage) => { state.progress = percentage * 100; }, { onError: (err: unknown) => { console.error(err); }, onComplete: () => { state.progress = 100; // or 0, or whatever }, }, ); ``` If you want, you can also pass `watch` options as the last argument: ```ts no-twoslash import { watchExtractedObservable } from '@vueuse/rxjs'; import { computed, reactive, useTemplateRef } from 'vue'; import { AudioPlayer } from '../my/libs/AudioPlayer'; // setup() const audio = useTemplateRef('audio'); const player = computed(() => (audio.value ? new AudioPlayer(audio.value) : null)); const state = reactive({ progress: 0, }); watchExtractedObservable( player, (p) => p.progress$, (percentage) => { state.progress = percentage * 100; }, { onError: (err: unknown) => { console.error(err); }, }, { immediate: true, }, ); ``` ## Type Declarations ```ts export type OnCleanup = (cleanupFn: () => void) => void; export type WatchExtractedObservableCallback = ( value: NonNullable, oldValue: OldValue, onCleanup: OnCleanup, ) => Observable; export interface WatchExtractedObservableOptions { onError?: (err: unknown) => void; onComplete?: () => void; } export declare function watchExtractedObservable< T extends MultiWatchSources, E, Immediate extends Readonly = false, >( sources: [...T], extractor: WatchExtractedObservableCallback, MapOldSources, E>, callback: (snapshot: E) => void, subscriptionOptions?: WatchExtractedObservableOptions, watchOptions?: WatchOptions, ): WatchHandle; export declare function watchExtractedObservable< T extends Readonly, E, Immediate extends Readonly = false, >( source: T, extractor: WatchExtractedObservableCallback, MapOldSources, E>, callback: (snapshot: E) => void, subscriptionOptions?: WatchExtractedObservableOptions, watchOptions?: WatchOptions, ): WatchHandle; export declare function watchExtractedObservable = false>( source: WatchSource, extractor: WatchExtractedObservableCallback, callback: (snapshot: E) => void, subscriptionOptions?: WatchExtractedObservableOptions, watchOptions?: WatchOptions, ): WatchHandle; export declare function watchExtractedObservable< T extends object, E, Immediate extends Readonly = false, >( source: T, extractor: WatchExtractedObservableCallback, callback: (snapshot: E) => void, subscriptionOptions?: WatchExtractedObservableOptions, watchOptions?: WatchOptions, ): WatchHandle; ```