2019년 5월 4일 14:05

RxJS 옵저버와 옵저버블

Reactive 프로그래밍이 익숙하지 않아 튜토리얼들을 하나씩 따라해보는 공간입니다.

Observer(옵저버)

옵저버(Observer) 는 옵저버블(Observable)이 방출한 데이터를 받아보는 구독자 역할입니다. RxJS 에서 옵저버의 인터페이스는 다음과 같습니다.

export interface Observer<T> {
  closed?: boolean
  next: (value: T) => void
  error: (err: any) => void
  complete: () => void
}

옵저버는 3개의 인터페이스가 필수적입니다.

  • next(): 옵저버블로부터 데이터를 받을 때 실행되는 콜백함수입니다.
  • error(): 옵저버블로부터 에러를 받을 때 실행되는 콜백함수입니다.
  • complete(): 옵저버블이 데이터 방출을 완료했을 때 실행되는 콜백함수입니다.

선택적인 인터페이스는 closed 인데 해당 인터페이스는 해당 옵저버가 구독을 취소했는지 여부를 나타내는 flag 입니다.

closed 를 어떻게 써야할지 아직 감이 안잡힌다. 나중에 다시 봐야겠다.

example

of 연산자를 통해 데이터 스트림을 생성하고 해당 스트림을 구독하는 코드입니다. Observer<T> 인터페이스를 구현해 어떻게 작동하는지 생각해봤습니다.

import { Observer, of } from 'rxjs'

const observer: Observer<number> = {
  closed: false,
  next(value): void {
    console.log(value)
  },
  error(error): void {
    console.error(error)
  },
  complete(): void {
    console.log('complete')
  },
}
of<number, number, number, number>(1, 2, 3, 4).subscribe(observer)

// output: 1 2 3 4 complete

Observable(옵저버블)

완전 자세한 내용은 해당 도큐멘트를 보면 되겠지만 지금은 개념만 짚고 넘어가려 합니다.

Observable

export class Observable<T> implements Subscribable<T> {
  ...
}

Subscribable

export interface Subscribable<T> {
  subscribe(observer?: PartialObserver<T>): Unsubscribable
  subscribe(
    next: null | undefined,
    error: null | undefined,
    complete: () => void
  ): Unsubscribable
  subscribe(
    next: null | undefined,
    error: (error: any) => void,
    complete?: () => void
  ): Unsubscribable
  subscribe(
    next: (value: T) => void,
    error: null | undefined,
    complete: () => void
  ): Unsubscribable
  subscribe(
    next?: (value: T) => void,
    error?: (error: any) => void,
    complete?: () => void
  ): Unsubscribable
}

Unsubscribable

export interface Unsubscribable {
  unsubscribe(): void
}

먼저 Observable<T>Subscribable<T> 를 구현하고 있어야합니다. Subscribable<T> 의 인터페이스를 살펴보면 subscribe() 메서드를 구현해야 하는데 인자로 세개를 받고 있습니다.

next(), error(), complete() 순서로 받고있는데 아까 살펴본 옵저버(Observer) 의 인터페이스와 유사합니다. 대신 complete() 가 옵셔널입니다. 한번 더 살펴보면 subscribe()Unsubscribable 을 리턴한다고 되어있는데 인터페이스는 unsubscribe() 메셔드입니다.

구독을 해서 원하는 만큼 실행이 되었으면 구독을 해제하는 시점도 있을 것입니다. 지금은 어떤 상황에 구독을 해제해야하는지보다는 어떻게 구독을 해제하는지에 대해 집중하겠습니다.

subscribe() 의 return 이 unsubscribe() 메서드이므로 해당 메서드를 통해 구독을 해제할 수 있습니다.

const number$ = of<number, number, number, number>(1, 2, 3, 4).subscribe(
  observer
)

number$.unsubscribe()

©2022 heecheolman

Built with Gatsby