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


250

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

답변:


311

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주제가 둘 이상의 값을 보유하도록하려는 경우 고려

16
그렇다면 이것이 작동하려면 subject.next () 전에 subject를 구독해야한다는 것을 의미합니까?
Eric Huang

5
주제에 대한 @eric, 예. 그것이 구별입니다.
onefootswill

9
당신이 BehaviorSubject의 생성자에 첫 번째 값을 전달해야한다는 주)
mrmashal

우리가 부울로 주제를 만들면 주제조차도 의식을 방출합니까 ?? const 주제 = new Subject <boolean> (); subject.next (true);
user2900572

도움이되는 경우 : 주제 = 이벤트-BehaviorSubject = 상태;
Jonathan Stellwag

251

행동 제목

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

12
"BehaviourSubject는 Subscription의 초기 값 또는 현재 값을 반환합니다"는 "BehaviorSubject에 하나의 값이 있습니다"보다 더 나은 설명입니다.
Davy

1
위의 코드를 Stackblitz에 넣었습니다. stackblitz.com/edit/rxjs-subjectvsbehaviorsubject
Fredrik_Macrobond

관찰자 B : 3은 어디에 있습니까?
OPV

@OPV ObserverB : 전화 동안 3가subject.next(3);
모하메드 샤 피르


6

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

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 

4

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.