[rxjs] Subject와 BehaviorSubject의 차이점은 무엇입니까?

a Subject와 a 의 차이점에 대해 명확하지 않습니다 BehaviorSubject. 그것은 단지인가요 BehaviorSubjectgetValue()기능을?



답변

BehaviorSubject에는 하나의 값이 있습니다. 구독하면 즉시 값을 내 보냅니다. 주제는 가치를 보유하지 않습니다.

주제 예 (RxJS 5 API 사용) :

const subject = new Rx.Subject();
subject.next(1);
subject.subscribe(x => console.log(x));

콘솔 출력이 비어 있습니다

행동 제목 예 :

const subject = new Rx.BehaviorSubject();
subject.next(1);
subject.subscribe(x => console.log(x));

콘솔 출력 : 1

게다가:

  • BehaviorSubject 초기 값으로 생성 가능 : new Rx.BehaviorSubject(1)
  • ReplaySubject주제가 둘 이상의 값을 보유하도록하려는 경우 고려

답변

행동 제목

BehaviourSubject는 Subscription의 초기 값 또는 현재 값을 반환합니다

var bSubject= new Rx.BehaviorSubject(0);  // 0 is the initial value

bSubject.subscribe({
  next: (v) => console.log('observerA: ' + v)  // output initial value, then new values on `next` triggers
});

bSubject.next(1);  // output new value 1 for 'observer A'
bSubject.next(2);  // output new value 2 for 'observer A', current value 2 for 'Observer B' on subscription

bSubject.subscribe({
  next: (v) => console.log('observerB: ' + v)  // output current value 2, then new values on `next` triggers
});

bSubject.next(3);

출력 :

observerA: 0
observerA: 1
observerA: 2
observerB: 2
observerA: 3
observerB: 3

제목

제목에서 구독의 현재 값을 반환하지 않습니다. 그것은 .next(value)호출시 에만 트리거 하고 반환 / 출력value

var subject = new Rx.Subject();

subject.next(1); //Subjects will not output this value

subject.subscribe({
  next: (v) => console.log('observerA: ' + v)
});
subject.subscribe({
  next: (v) => console.log('observerB: ' + v)
});

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

콘솔에 다음과 같은 출력이 있습니다.

observerA: 2
observerB: 2
observerA: 3
observerB: 3


답변

방금 모든 주제차이점 을 설명 하는 프로젝트만들었습니다 : https://github.com/piecioshka/rxjs-subject-vs-behavior-vs-replay-vs-async

여기에 이미지 설명을 입력하십시오


답변

이해하는 데 도움이 될 수 있습니다.

import * as Rx from 'rxjs';

const subject1 = new Rx.Subject();
subject1.next(1);
subject1.subscribe(x => console.log(x)); // will print nothing -> because we subscribed after the emission and it does not hold the value.

const subject2 = new Rx.Subject();
subject2.subscribe(x => console.log(x)); // print 1 -> because the emission happend after the subscription.
subject2.next(1);

const behavSubject1 = new Rx.BehaviorSubject(1);
behavSubject1.next(2);
behavSubject1.subscribe(x => console.log(x)); // print 2 -> because it holds the value.

const behavSubject2 = new Rx.BehaviorSubject(1);
behavSubject2.subscribe(x => console.log('val:', x)); // print 1 -> default value
behavSubject2.next(2) // just because of next emission will print 2


답변

BehaviorSubject옵저버 블에 의해 방출 된 마지막 값을 메모리에 유지합니다. 일반 Subject은 그렇지 않습니다.

BehaviorSubjectReplaySubject버퍼 크기가 1 인 것과 같습니다 .


답변