Subject

lee jae hwan·2022년 9월 1일
0

RxJS

목록 보기
13/21

RxJS에서 Subject는 옵저버블객체처럼 작동할 수 도 있고 옵저버객체처럼 콜백으로 작동할 수도 있다. 더구나 2가지 역활을 하나의 객체로서 수행할 수 도 있다.

const subject = new Subject<number>();
subject.subscribe(console.log);
subject.subscribe(console.log);
subject.next(1);

subjectr객체에 구독을 할 수 있으며 next함수를 호출하는 옵저버역활도 할 수 있다.

next함수로 데이터를 방출하면 2개의 구독한 옵저버를 멀티캐스트할 수 있다.

const obs = new Observable<number>(observer=>observer.next(2));
obs.subscribe(console.log);
obs.subscribe(console.log);

옵저버블로서도 Subject와 같이 구현할 수 있지만 옵저버블생성자에 옵저버수행제한이 생기며 subject처럼 멀티캐스트가 아닌 개별적으로 방출을 하는것에 차이가 있다.


const subject = new Subject<number>();
subject.subscribe(console.log);
subject.subscribe(console.log);

const observable = from([1,2,3]);
observable.subscribe(subject);

옵저버블객체는 구독을 필요로하지만 subject객체는 구독한상태에서도 옵저버로역활을 할수 있다.

멀키캐스팅의 의미

두번째 구독을 setTimeout함수로 시간차이를 두고 설정하면 해당 시간에서 방출된 데이터를 받는다. 그러나 옵저버블객체를 사용할때는 2번째 구독함수는 처음데이터부터 방출을 받아 처리한다.


BehaviorSubject

가장 최근에 방출한 값을 기억하고 있다가 구독되면 기억한값을 방출한다.

    const subject = new BehaviorSubject<number>(0);

    subject.subscribe({
      next: (v) => console.log(`observerA: ${v}`),
    });

    subject.next(1);
    subject.next(2);

    subject.subscribe({
      next: (v) => console.log(`observerB: ${v}`),
    });

new BehaviorSubject< number >(0);은 객체생성과 동시에 방출한 값을 가지고 있다.
subject.next(1);로 데이터가 방출되어도 이미 방출할 값을 가지고 있기때문에 0이 먼저 방출된다.

새롭게 구독되면 이미 방출할 값(2)을 가지고 있기때문에 2를 먼저 방출한다.


ReplaySubject

최근 방출값을 정해진 숫자만큼 기억하고 있다가 다시 구독되면 기억한 값들을 방출한다.

    const subject = new ReplaySubject<number>(3);

    subject.subscribe({
      next: (v) => console.log(`observerA: ${v}`),
    });

    subject.next(1);
    subject.next(2);
    subject.next(3);
    subject.next(4);

    subject.subscribe({
      next: (v) => console.log(`observerB: ${v}`),
    });
    subject.next(5);

new ReplaySubject< number >(3); 최근에 방출한 값 3개를 기억한다.

subject.next(1);
subject.next(2);
subject.next(3);
subject.next(4);

1,2,3,4 중 최근 3개 2,3,4 를 기억한다.

구독함수가 연결되면 2,3,4를 방출하고 다음 방출값 5는 첫번째 구독함수에서 방출되고 2번째 구독함수에서 방출된다.


AsyncSubject

데이터방출이 완료된되어야 마지막 방출데이터값만 방출한다.

   const subject = new AsyncSubject();

    subject.subscribe({
      next: (v) => console.log(`observerA: ${v}`),
    });

    subject.next(1);
    subject.next(2);
    subject.next(3);
    subject.next(4);

    subject.subscribe({
      next: (v) => console.log(`observerB: ${v}`),
    });

    subject.next(5);
    console.log('dddd');
    subject.complete();

0개의 댓글