2016-09-25 4 views
3

Ich versuche Problem zu lösen, wenn ich zwei Observable, die ich in Einzelwert kombinieren möchten in Angular2 und Angularfire2RxJs Kombinieren Observable

lässt sich vorstellen, ich Bankkonto und Transaktionen von zwei Typen haben, abgehende und ankommende (es ist nur ein Anwendungsfall, den ich für den Zweck der Übung geschaffen habe). Und ich möchte sie zusammenrechnen, um den tatsächlichen Kontostand zu erhalten.

Vorlage:

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

und schließlich der Dienst, der die Daten

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

bieten sollte}

Dieses auf Firebase Endlosschleife verursacht (und keine Daten in Vorlage anzeigen). Ich habe auch versucht Observer.merge() und einige andere, aber ich denke, ich versuche nur, absolut falsche Ansatz zu verwenden.

Schätzen Sie jede Hilfe, danke!

bearbeiten:

nur eine andere Lösung versucht, verwenden Sie einfach einen Stream alle eingehenden Transaktionen zu zählen:

public getAllIncoming(account: IAccount){ 

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

wieder unendlich Abfragen generiert.

EDIT2:

i auch

forkJoin versucht, wie oben
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; 
     }) 
} 

mit derselben Vorlage. Ergebnis: Wert wird nicht in der Vorlage angezeigt und console.log mit Ergebnis wird nicht gedruckt

+0

Haben Sie versucht, Observable.forkJoin ([obs1, obs2, ...]) '? – Brad

+0

ja, ich habe. Ich war damit auch nicht erfolgreich. Wie gesagt, ich habe nur Fehler oder unendliche API-Aufrufe bekommen. :( –

+0

Welcher Fehler es wirft? Operator 'Observable.forkJoin()' sollte tun, was Sie brauchen. – martin

Antwort

0

Eine andere Option ist combineLastest ausprobieren. Im Folgenden wird davon ausgegangen, dass Ihre eingehenden und ausgehenden Kontoanrufe eine FirebaseListObservable zurückgeben und Sie versuchen, sie zu einer Liste zusammenzufassen (accounts).

Es könnte gut sein, temporäre .do() Nebenwirkungen hinzufügen zu jedem Eingang, wenn sie und welche Ergebnisse an erster Stelle genannt werden, um zu sehen Ströme werden, vor allem da den Block kombinieren scheint nicht in Ihrem genannt werden vorherige Beispiele.

Verwandte Themen