簡體   English   中英

RxJs結合了Observables

[英]RxJs Combine Observables

我正在嘗試解決問題,當我有兩個Observables,我想在Angular2和Angularfire2中組合成單個值

讓我們想象一下,我有兩種類型的銀行賬戶和交易,傳出和傳入(它只是用於實踐目的而創建的用例)。 我想將它們加在一起以獲得實際的賬戶余額。

模板:

....
 <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;
        }
    )

}

這個導致Firebase無限循環(並且不在模板中顯示數據)。 我也試過Observer.merge()和其他一些但我認為我只是試圖使用絕對錯誤的方法。

感謝任何幫助,謝謝!

編輯

剛試過另一個解決方案,只使用一個流來計算所有傳入的事務:

public getAllIncoming(account: IAccount){

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

再次生成無限查詢。

編輯2

我也試過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;
        })
}

使用與上面相同的模板。 結果:值未顯示在模板和console.log中,結果未打印

另一個選擇是嘗試combineLastest 下面假設您的傳入和傳出帳戶調用返回FirebaseListObservable並且您嘗試將它們合並到一個列表( accounts )中。

return Observable.combineLatest(

  // added .do() to make sure incoming is working
  this.getIncomingTransactionsForAccount(account)
    .do(x => console.log('incoming transactions', x),

  // added .do() to make sure outcoming is working
  this.getOutcomingTransactionsForAccount(account)
    .do(y => console.log('outcoming transactions', y),

  (incoming, outcoming) => {
    // ... do your calculations
    let result = {
      // results
    };
    return result;
  }

);

最好為每個輸入流添加臨時的.do()副作用,以查看它們是否被調用並首先返回結果,特別是因為在前面的示例中似乎沒有調用combine塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM