Skip to content

Instantly share code, notes, and snippets.

@steveholgado
Created January 9, 2020 23:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save steveholgado/cdad6b5ba2e365458bd7954e4ddbd346 to your computer and use it in GitHub Desktop.
Save steveholgado/cdad6b5ba2e365458bd7954e4ddbd346 to your computer and use it in GitHub Desktop.

React useObservable hook

A hook for integrating RxJS observables with React.

Example usage

const [value, next, error, complete] = useObservable(obs$ => obs$.pipe( /* ... */ ), 'initial value')
import { useState, useEffect, useMemo, useCallback } from 'react'
import { Subject, isObservable } from 'rxjs'
function useObservable(generateEnhancedObservable, initValue) {
const sub$ = useMemo(() => new Subject(), [])
const next = useCallback(sub$.next.bind(sub$), [])
const [value, setValue] = useState(initValue)
const [error, setError] = useState(null)
const [complete, setComplete] = useState(false)
useEffect(() => {
const obs$ = sub$.asObservable()
const enhanced$ = typeof generateEnhancedObservable === 'function'
? generateEnhancedObservable(obs$)
: obs$
if (!isObservable(enhanced$)) {
throw new Error('The function passed to "useObservable" does not return an observable')
}
const subscription = enhanced$.subscribe({
next: value => {
setValue(value)
setError(null)
},
error: err => setError(err instanceof Error ? err.message : err),
complete: () => setComplete(true)
})
return () => subscription.unsubscribe()
}, [])
return [value, next, error, complete]
}
export default useObservable
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment