---
category: '@RxJS'
---

# useObservable

Use an RxJS [`Observable`](https://rxjs.dev/guide/observable), return a `ref`, and automatically unsubscribe from it when the component is unmounted.

## Usage

<!-- TODO: import rxjs error if enable twoslash -->

```ts no-twoslash
import { useObservable } from '@vueuse/rxjs';
import { interval } from 'rxjs';
import { mapTo, scan, startWith } from 'rxjs/operators';

// setup()
const count = useObservable(
  interval(1000).pipe(
    mapTo(1),
    startWith(0),
    scan((total, next) => next + total),
  ),
);
```

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).

```ts no-twoslash
import { useObservable } from '@vueuse/rxjs';
import { interval } from 'rxjs';
import { map } from 'rxjs/operators';

// setup()
const count = useObservable(
  interval(1000).pipe(
    map((n) => {
      if (n === 10) throw new Error('oops');

      return n + n;
    }),
  ),
  {
    onError: (err) => {
      console.log(err.message); // "oops"
    },
  },
);
```

## Type Declarations

```ts
export interface UseObservableOptions<I> {
  onError?: (err: any) => void;
  /**
   * The value that should be set if the observable has not emitted.
   */
  initialValue?: I | undefined;
}
export declare function useObservable<H, I = undefined>(
  observable: Observable<H>,
  options?: UseObservableOptions<I | undefined>,
): Readonly<Ref<H | I>>;
```
