SubjectとBehaviorSubjectの違いは何ですか?


250

a Subjectとaの違いははっきりしませんBehaviorSubject。a BehaviorSubjectgetValue()機能があるだけですか?

回答:


311

BehaviorSubjectは1つの値を保持します。サブスクライブすると、すぐに値が出力されます。サブジェクトは値を保持していません。

件名の例(RxJS 5 APIを使用):

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

コンソール出力は空になります

BehaviorSubjectの例:

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

コンソール出力:1

加えて:

  • BehaviorSubject 初期値で作成できます:新規 Rx.BehaviorSubject(1)
  • ReplaySubject件名に複数の値を保持するかどうかを検討します

16
これが機能するためには、subject.next()の前にsubjectをサブスクライブする必要があるということですか?
Eric Huang

5
件名の@eric、はい。それが違いです。
onefootswill

9
最初の値をBehaviorSubjectのコンストラクターに渡す必要があることに注意してください;)
mrmashal

ブール値でサブジェクトを作成した場合でも、サブジェクトは儀式を発行しますか?const subject = new Subject <boolean>(); subject.next(true);
user2900572

それが役立つ場合:Subject = Event-BehaviorSubject = State;
Jonathan Stellwag

251

BehaviourSubject

BehaviourSubjectは、サブスクリプションの初期値または現在の値を返します

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はサブスクリプションの初期値または現在の値を返す」という方が「BehaviorSubjectが1つの値を保持する」よりも適切な説明です。
デイビー

1
私はStackblitzに上記のコードを置く:stackblitz.com/edit/rxjs-subjectvsbehaviorsubject
Fredrik_Macrobond

observerB:3はどこにありますか?
OPV 2019年

@OPV ObserverB:電話中に3がありますsubject.next(3);
Mohammed Safeer


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.