3

次のようなコードスニペットがあります

var videosNeedFix = Rx.Observable.fromArray(JSON.parse(fs.readFileSync("videoEntries.json"))).share();

videosNeedFix.count().subscribe(function(count){ //subscrption A
  console.log(count + " in total"); 
});


videosNeedFix.subscribe(function(videoEntry){ //subscription B
  console.log(videoEntry.id, videoEntry.name, videoEntry.customFields); 
});

videoEntries.json は、videoEntry オブジェクトの JSON シリアル化配列です。サブスクリプション A とサブスクリプション B の両方が、videosNeedFix オブザーバブルによって発行されたデータを受け取ることを期待しています。

ただし、コンソール ログによると、サブスクリプション A のみがデータを受信し、サブスクリプション B は受信しません。2 つのサブスクリプションを作成する順序を入れ替えると、subscriptionB だけがデータを参照できます。オブザーバブルが最初のサブスクリプションにのみデータを発行するのはなぜですか?

4

1 に答える 1

0

これは、Rx.Subjectの適切な使用例です (おそらく唯一の使用例です - To Use Subject Or Not To Use Subject? を参照)。

次の例を考えてみましょう。このコード (コメントに記載されている .delay() ハックを使用) は機能しますが、私には少しハックなようです:

  let stream$ = Rx.Observable
        .return(updatesObj)
        .map(obj => Object.assign({}, obj.localData, obj.updates))
        .delay(1) //Hacky way of making it work
        .share()

    stream$
        .flatMap(obj => Observable.fromPromise(AsyncStorage.setItem('items', JSON.stringify(obj))))
        .catch(Observable.return(false))
        .subscribe()

      stream$
        .subscribe(obj =>  dispatch(dataIsReady(obj)))

Rx.Subjects の例:

  let subjS = new Rx.Subject()

  let stream$ = subjS
    .map(obj => Object.assign({}, obj.localData, obj.updates))
    .share()

  stream$
    .flatMap(obj => Observable.fromPromise(AsyncStorage.setItem('items', JSON.stringify(obj))))
    .catch(Observable.return(false))
    .subscribe()

  stream$
    .subscribe(obj =>  dispatch(dataIsReady(obj)))

  subjS.onNext(updatesObj)
于 2016-02-26T02:08:40.430 に答える