1

BehaviorSubjectインスタンス ( )から共有マッピングをサブスクライブすると、t最初のサブスクリプションのみが実行されます。

元のBehaviorSubject( obj) が 2 番目の値を発行すると、最新の値のみが出力され、両方のサブスクリプションが実行されます。

私のコードをチェックしましょう

const obj = new Rx.BehaviorSubject(1)
obj.subscribe(console.log)
const t = obj.map(u => {
  console.log("mapped")
  return u * 10
}).share()

t.subscribe(x => console.log("subscribe 1 " + x))
t.subscribe(x => console.log("subscribe 2 " + x))
//with the following line un-commented, both subscriptions print out new value
//obj.next(2)

私の期待される結果は

1
mapped
subscribe 1 10
subscribe 2 10

しかし、実際の結果は

1
mapped
subscribe 1 10

素朴な質問で申し訳ありません。これを私に説明できる人はいますか?

どうもありがとう

4

2 に答える 2

0

あなたの例では、2 つのサブジェクトがあります。

  • BehaviorSubjectobj。_

  • Subjectインスタンス内部.share()

は、サブスクライブした場合にのみBehaviorSubject、キャッシュされた値を発行することに注意してください。

最初のオブザーバーobj.subscribe(console.log)は、 に直接サブスクライブしBehaviorSubjectます。これは印刷され1ます。

次に、オペレーターtで終わるチェーンを作成します。share()

これで、 にサブスクライブしtますt.subscribeSubjectこれは、内部にサブスクライブすることを意味します。share()これは最初のオブザーバーであるため、ソース Observable にサブスクライブする必要があります (これBehaviorSubjectは、キャッシュされた値を発行するソースに到達します)。は、演算子をshare()で使用するための単なるショートカットであることに注意してください。multicast()refCount()

そして、あなたが再びサブスクライブする最後の行t.subscribe. 前と同じように、これはSubjectinside にサブスクライブしshare()ます。ただしshare()、すでにソース Observable にサブスクライブされているため、別のサブスクリプションは作成されません。それがマルチキャストとmulticast()オペレーターのポイントです。

そのため、何も表示されず、印刷されたsubscribe 2 10イベントが 2 回表示されることもありません。source ではなく、insideをmapped購読しています。Subjectshare()BehaviorSubject

于 2017-12-04T12:10:25.990 に答える