1. ホーム
  2. javascript

[解決済み] BehaviorSubjectとObservableの違い?

2022-03-17 17:33:16

質問

Angular RxJsのパターンを調べているのですが、「Angular RxJs」と「Angular RxJs」の違いが分かりません。 BehaviorSubjectObservable .

私の理解では BehaviorSubject は、時間の経過とともに変化することができる値です (購読することができ、購読者は更新された結果を受け取ることができます)。これは、まさに Observable .

を使うのはどんなときか? Observable とは異なり BehaviorSubject ? を使用する利点はありますか? BehaviorSubject よりも Observable またはその逆は?

どのように解決するのですか?

動作対象 はサブジェクトの一種です。サブジェクトは特別なタイプの観測物なので、他の観測物と同じようにメッセージを購読することができます。BehaviorSubjectのユニークな特徴は以下の通りです。

  • を受信していなくても、購読時には常に値を返す必要があるため、初期値が必要です。 next()
  • サブスクリプション時に、サブジェクトの最後の値を返します。通常のオブザーバブルは onnext
  • を使用すると、任意の時点で、非オブザーバブルコード内のサブジェクトの最後の値を取得することができます。 getValue() メソッドを使用します。

観察可能なものと比較した場合の被写体のユニークな特徴とは

  • observableであることに加えてobserverでもあるので、subscribeするだけでなく、subjectに値を送ることもできる。

また、ビヘイビアサブジェクトからobservableを取得するためには asObservable() メソッドで BehaviorSubject .

オブザーバブル はジェネリックであり BehaviorSubject は技術的にはObservableのサブタイプである。なぜならBehaviorSubjectは特定の品質を持つobservableだからである。

を使った例 ビヘイビアサブジェクト :

// Behavior Subject

// a is an initial value. if there is a subscription 
// after this, it would get "a" value immediately
let bSubject = new BehaviorSubject("a"); 

bSubject.next("b");

bSubject.subscribe(value => {
  console.log("Subscription got", value); // Subscription got b, 
                                          // ^ This would not happen 
                                          // for a generic observable 
                                          // or generic subject by default
});

bSubject.next("c"); // Subscription got c
bSubject.next("d"); // Subscription got d

通常の主語を使った例2。

// Regular Subject

let subject = new Subject(); 

subject.next("b");

subject.subscribe(value => {
  console.log("Subscription got", value); // Subscription wont get 
                                          // anything at this point
});

subject.next("c"); // Subscription got c
subject.next("d"); // Subscription got d

observableは SubjectBehaviorSubject を使って subject.asObservable() .

唯一の違いは、observableに値を送るのに next() メソッドを使用します。

Angularサービスでは、私は BehaviorSubject というのも、アンギュラサービスはコンポーネントやビヘイビアサブジェクトよりも先に初期化されることが多く、サービスを消費するコンポーネントが、たとえそのコンポーネントがこのデータを購読してから新しい更新がなくても、最終更新データを受け取ることを保証してくれるからです。