4

ストリーム/オブザーバブルを作成しようとしています...

  1. サブスクライバーがある場合にのみイベントを出力します
  2. 新しいサブスクライバーに最新の値を提供します。

具体的なケースは、特定のイベントが発生するたびに Async API 呼び出しを行うオブザーバブルが必要ですが、サブスクライバーがある場合のみです。不要な API 呼び出しを回避しようとしています。

このようなサブスクライバーがいる場合にのみ起動するストリームを作成することができました...

let dataStream = Rx.Observable
   .interval(1000) // Fire an event every second
   .singleInstance() // Only do something when we have subscribers
   .startWith(null) // kick start as soon as something subscribes
   .flatMapLatest(interval => SomeAPI.someDataGet()) // get data, returns a promise

そして、これは機能します。console.log(...)メソッド内にある場合SomeAPI.someDataGet、ストリームにサブスクライバーがいる場合にのみ起動します。私の実装は、React コンポーネントのライフサイクル メソッドに非常にうまく適合するサブスクライブとサブスクライブ解除のためにこれを行うため、非常に見栄えがします。

let sub1;
sub1 = dataStream.subscribe(x => console.log('sub1', x));
sub1.dispose();

また、新しいサブスクライバーがサブスクライブするとすぐに最新の値を受け取るようにしたいと考えています。これは私が苦労しているところです。私がこれをしたら...

let sub1, sub2;
sub1 = dataStream.subscribe(x => console.log('sub1', x));

setTimeout( () => {
    sub2 = dataStream.subscribe(x => console.log('sub2', x));
}, 1500)

...次の間隔までconsole.logforが表示されません。sub2

私の理解が正しければ。Hot Observableが必要です。だから私はこのようなストリームを作成しようとしました...

let dataStream = Rx.Observable
   .interval(1000) // Fire an event every second
   .singleInstance() // Only do something when we have subscribers
   .startWith(null) // kick start as soon as something subscribes
   .flatMapLatest(interval => SomeAPI.someDataGet()) // get data
   .publish() // Make this a hot observable;

私が理解しているようにdataStreamhot observable.

ただし、私のテストでは、2 番目のサブスクリプションは次の間隔までデータを受信しません。さらに、これにより、サブスクライブ時に dataStream を接続および切断する必要が生じますが、これは可能であれば避けたいものです。

私は RxJS にまったく慣れていないので、ここで何が起こっているのかを誤解していても驚かないでしょう。

4

1 に答える 1

6

の代わりに.publish()、 を使用します.shareReplay(1)

于 2015-09-24T13:34:17.447 に答える