916

Angular RxJs パターンを調べていますが、 aBehaviorSubjectと anの違いがわかりませんObservable

私の理解では、aBehaviorSubjectは時間の経過とともに変化する可能性がある値です (サブスクライブすることができ、サブスクライバーは更新された結果を受け取ることができます)。これは、のまったく同じ目的のようObservableです。

いつ anObservableと aを使いBehaviorSubjectますか? またはその逆を使用BehaviorSubjectする利点はありますか?Observable

4

12 に答える 12

1269

BehaviorSubjectはサブジェクトのタイプです。サブジェクトは特殊なタイプのオブザーバブルであるため、他のオブザーバブルと同様にメッセージをサブスクライブできます。BehaviorSubject のユニークな機能は次のとおりです。

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

オブザーバブルと比較したサブジェクトの固有の機能は次のとおりです。

  • オブザーバブルであるだけでなくオブザーバーでもあるため、サブジェクトにサブスクライブするだけでなく、サブジェクトに値を送信することもできます。

asObservable()さらに、メソッド onを使用して、behaviour subject からオブザーバブルを取得できますBehaviorSubject

Observableは Generic であり、BehaviorSubject技術的には Observable のサブタイプです。これは、BehaviorSubject が特定の性質を持つ Observable であるためです。

BehaviorSubjectの例:

// 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

SubjectObservable は、 と の両方からBehaviorSubject作成できますsubject.asObservable()

唯一の違いは、メソッドを使用してオブザーバブルに値を送信できないことですnext()

Angular サービスでは、Angular サービスがBehaviorSubjectコンポーネントの前に初期化されることが多いため、データ サービスに使用します。このデータへのコンポーネントのサブスクリプション以降に新しい更新がない場合でも、サービスを使用するコンポーネントが最後に更新されたデータを受信することを動作サブジェクトが保証します。

于 2016-10-25T04:53:19.367 に答える
32

Observable オブジェクトは、プッシュ ベースのコレクションを表します。

Observer および Observable インターフェースは、オブザーバー デザイン パターンとも呼ばれる、プッシュ ベースの通知の一般化されたメカニズムを提供します。Observable オブジェクトは、通知を送信するオブジェクト (プロバイダー) を表します。Observer オブジェクトは、それらを受け取るクラス (オブザーバー) を表します。

Subject クラスは、オブザーバーとオブザーバブルの両方であるという意味で、Observable と Observer の両方を継承します。サブジェクトを使用してすべてのオブザーバーをサブスクライブし、サブジェクトをバックエンド データ ソースにサブスクライブできます。

var subject = new Rx.Subject();

var subscription = subject.subscribe(
    function (x) { console.log('onNext: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted'); });

subject.onNext(1);
// => onNext: 1

subject.onNext(2);
// => onNext: 2

subject.onCompleted();
// => onCompleted

subscription.dispose();

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.mdの詳細

于 2016-09-14T15:27:14.980 に答える