web-dev-qa-db-ja.com

異なるRxJSサブジェクトのセマンティクスは何ですか?

トピックのドキュメントはまばらであり、そこに「入り口」を見つけることは困難です。

19
Ivan Kleshnin

意味論は主題のタイプによって異なります。バニラ(_Rx.Subject_)と専用サブジェクト(他の3つ)の2種類に分けます。特別な目的のサブジェクトは、その特殊化(たとえば、完了/再接続動作)のために、いくつかの注意点があるバニラサブジェクトのセマンティクスの一部を共有します。

バニラRx.Subjectセマンティクス

  1. 主な特徴

    • サブジェクトは、オブザーバー、オブザーバブルインターフェイス(およびプロトタイプにdisposeハンドラーがあるため、使い捨てインターフェイス)を実装します。それは、とりわけ、彼らが持っていることを意味します:
      • オブザーバーインターフェイス:onNextonErroronCompleteメソッド
      • 監視可能なインターフェイス:subscribeメソッド
    • サブジェクトをオブザーバーまたはオブザーバブルにキャストして、追加のインターフェイスの実装を非表示にすることができます(cf. .asObserver() 、and .asObservable() )必要な場合
    • サブジェクトはオブザーバブルなので、複数のオブザーバーをサブスクライブできます。そのオブザーバブルは、そのデータをすべてのオブザーバーにブロードキャストします。内部的には、被験者は一連のオブザーバーを維持しています。
    • サブジェクトはオブザーバーであり、任意のオブザーバブルをサブスクライブできます
    • サブジェクトを構成するオブザーバーとオブザーバブルが2つの異なるエンティティである場合、それがユースケースであれば、他のエンティティとは独立して使用できます。
    • disposeingサブジェクトは すべてのオブザーバの登録を解除し、リソースを解放します。
    • サブジェクトはスケジューラーをとらず、 すべてのシリアライゼーションと文法の正確さがサブジェクトの呼び出し元によって処理されると想定します。
    • サブジェクトのデフォルトの動作は、値をオブザーバーに同期的に送信することです最初にサブスクライブされたオブザーバーから最後。ほとんどの場合、順序は関係ありません。

Rxjsコントラクトと文法 の重要な側面を引用します:

この文法により、オブザーバブルシーケンスは任意の量(0以上)のonNextメッセージをサブスクライブしたオブザーバーインスタンスに送信でき、オプションでその後に単一の成功(onCompleted)または失敗(onError)メッセージが続きます。

  • バニラのサブジェクト(new Rx.Subject()で作成)はその文法を実装します。onCompletedが1回呼び出されると、その後のonNextの呼び出しはすべて無視されます。同じオブザーバーでのonCompletedの2回目の呼び出しも無視されます。オブザーバーがサブジェクトのオブザーバブル側にサブスクライブすると、そのonCompleteコールバックがすぐに呼び出されます( http://jsfiddle.net/cLf6Lqsn/1/ ) 。

    1. 創作

      • new Rx.Subject()

    オブザーバーをオブザーバブル( jsfiddle )に接続するサブジェクトを返します。この例は、公式 のドキュメント から抜粋したものであり、プロキシとしてサブジェクトを使用する方法を示しています。サブジェクトはソース(オブザーバー側)にサブスクライブされ、オブザーバー(オブザーバブル側)にもリッスンされます。 onNext(オブザーバー側)を呼び出すと、オブザーバー側ごとに同じ値でonNextが呼び出されます。

    • Rx.Subject.create(observer, observable)

    指定されたオブザーバーおよびオブザーバブルからサブジェクトを作成します。これら2つは必ずしも接続されていません。ソケットからのデータの送受信に使用されるサブジェクトを返す _Rx.Dom.fromWebSocket_ の実装で良い例を見ることができます。サブジェクトのオブザーバー側がデータをソケットに送信します。観測可能な側は、ソケットからの着信データをリッスンするために使用されます。また、この方法で作成されたサブジェクトには、disposeメソッドがありません。

特殊化されたRx.Subjectセマンティクス

  • これは _reactivex.io_ documentation で、専門分野のほとんどのセマンティクスをかなりカバーしています。
  • 言及すべき他の興味深い点は、完了後の動作に関するものです。
  • asyncbehaviorreplay の動作を示すサンプルコードはこちら

うまくいけば、私はあまり間違えなかった。修正させていただきます。最後の注意、これはRxJS v4に有効です。

コールド/ホットオブザーバブルの動作の詳細な説明については、 ホットおよびコールドオブザーバブル:「ホット」および「コールド」演算子はありますか?

39
user3743222