2016-09-25 5 views
3

を組み合わせて発信および着信、私は銀行口座と2種類の取引を持って想像することができます(練習目的のために作ったちょっとした使い方)。実際の口座残高を得るためにそれらを合計したいと思います。RxJsは、私は私は2つの私はAngular2に1つの値に結合したい観測とAngularfire2</p> <p>を持っているときに問題を解決しようとしている観測

テンプレート:データを提供すべきである

.... 
<div *ngFor="let account of accounts | async"> 
    {{ (transactionService.getAccountBalance(account) | async)?.balance }} 
</div 
.... 

、最終的にサービス

getAccountBalance(account){ 
    return Observable.zip(
     this.getIncomingTransactionsForAccount(account), // FirebaseListObservable 
     this.getOutcomingTransactionsForAccount(account) // FirebaseListObservable 
    , (incoming, outcoming) => { 
      .... 
      let result = { 
       account: account.$key, 
       balance: someCalculatedNumber 
      }; 
      console.log(result); // result is correct there 
      return result; 
     } 
    ) 

}

この1つはFirebase上無限ループさせる(およびテンプレートのデータを表示しません)。私もObserver.merge()といくつか他を試しましたが、私はまったく間違ったアプローチを使用しようとしていると思います。

ありがとうございました!

編集

public getAllIncoming(account: IAccount){ 

    return this.getIncomingTransactionsForAccount(account) 
     .scan((x, y) => { 
      console.log(x, y); 
      return 1; 
     }, 0); 
} 

は再び無限のクエリを生成します。

は、ちょうどすべての着信トランザクションをカウントするだけで一つのストリームを使用し、別の解決策を試してみました。

EDIT2

私は上記と同じテンプレートを使用してもforkJoin

public getAccount2Balance(account: IAccount) { 

    return Observable.forkJoin([ 
      this.getIncomingTransactionsForAccount(account), 
      this.getOutcomingTransactionsForAccount(account) 
     ], (incoming, outcoming) => { 
      ... 
      let result = { 
       account: account.$key, 
       balance: someCalculatedNumber 
      }; 
      console.log(result); 
      return result; 
     }) 
} 

を試みました。結果: 値はテンプレートに表示されず、結果は出力されません。

+0

Observable.forkJoin([obs1、obs2、...])を試しましたか? – Brad

+0

はい、私はしました。私もそれで成功しなかった。言ったように、私はちょうどエラーや無限のAPI呼び出しを取得していた。 : –

+0

どのようなエラーがスローされるのですか?演算子 'Observable.forkJoin()'は必要な処理を行う必要があります – martin

答えて

0

もう1つの方法は、combineLastestです。以下は、あなたの着信および発信アカウントコールがFirebaseListObservableを返しており、それらを1つのリスト(accounts)に結合しようとしていると仮定しています。

各入力に一時的.do()副作用を追加するためには良いかもしれない、彼らはと呼ばれ、最初の場所で結果を返すされている場合兼ね備えブロックは、あなたの中で呼び出されるようには見えない、特に以来、見にストリーム前の例。

関連する問題