2017-12-25 15 views
1

Ich habe die folgende Situation mit Observables in meiner Angular4 App, die ich einfach nicht zur Arbeit kommen kann: Ich möchte zusammenfassende Daten aller meiner Buchungstage für eine Übersichtsseite sammeln. Alle Tage zu bekommen ist eine Beobachtungsstelle, und jeden Tag gibt es eine Liste von Buchungen dieses Tages, die ich abrufen muss - wieder eine beobachtbare Quelle. Aus dieser Liste errechne ich eine Zusammenfassung des Tages. All diese Zusammenfassungen möchte ich in einer sich daraus ergebenden Beobachtbarkeit emittieren.RxJS: Observable von Array für Array von Observables

Ich habe viel kompliziertere Dinge ausprobiert, aber immer die inneren Observablen, auf die ich nicht gewartet habe, um fertig zu werden, und ich habe leere Zusammenfassungen. Ich habe zurück zu den Grundlagen bekommen, und etwas in diese Richtung sollte funktionieren:

getSummaries(): Observable<BookingDaySummary[]> { 
    return this.bookingService.getBookingDays().take(1).mergeMap(
     days => this.calculateSummaryOfDays(days) 
    ) 
}; 

private calculateSummaryOfDays(days: BookingDay[]): Observable<BookingDaySummary[]> { 
    const summaries$ = days.map(day => this.calculateSummary(day)); 
    // I'm aware that the next line is not correct. 
    // Essentially I want the array of observables to complete 
    // and have an array of the resulting values. 
    return Observable.merge(summaries$); 
} 

private calculateSummary(day: BookingDay): Observable<BookingDaySummary> { 
    // ... logic to get summary from one day 
} 

jedoch die Art der summaries$ ist Observable<Observable<BookingDaySummary> und nicht beobachtbar. Es läuft also alles auf: Wie mache ich einen Observable<T[]> von [Observable<T>]?

Auch: Sollte die innerste Methode, die ich in .map benutze, ein Observable zurückgeben oder einfach eine Karte auf dem ankommenden Typ zu T sein, wenn ich beabsichtige, ein Observable<T> zu produzieren?

+0

Berechnet collectSummary wirklich (muss) ein Observable zurückgeben? –

+0

@ IngoBürk: Das war Teil der Frage. Ich habe beides versucht. Die Methode selbst verwendet ein Observable (ein anderer DB-Abruf), also muss es wohl sein. – EluciusFTW

Antwort

0

versuchen

return Observable.from(summaries$).mergeMap(value=>value); 

ich Zusammenfassungen nehme eine Reihe von beobachtbar ist - beobachtbare [] Verwendung Observable.from wird sie eins nach dem anderen und gefolgt von mergeMap emittieren zu glätten und die beobachtbaren und am Ende führen Sie wird eine reine Wertemission erhalten.

+0

'Observable ' kann nicht dem Typ 'Observable 'zugeordnet werden, wenn ich Ihren Vorschlag ausprobiere. – EluciusFTW

+0

ändern Sie Ihre Eingabe von Observable zu Observable oder verwenden Sie einfach , um zu sehen, ob es zuerst funktioniert –

+0

Während dieses Code-Snippet die Frage lösen kann, [einschließlich einer Erklärung] (http: //meta.stackexchange. com/questions/114762/complete-code-based-answer) hilft wirklich, die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. –

0

Verwenden Sie die RxJS combineLatest statische Funktion auf Ihre letzte Aussage von calculateSummaryOfDays:

return Observable.combineLatest(summaries$); 

Beachten Sie, dass Ihre summaries$ ein Array von Observablen ist:

const summaries$: Observable<BookingDaySummary>[] = ... 

Vom combineLatest documentation:

Kombiniert mehrere Observables mit Crea te ein Observable, dessen Werte aus den letzten Werten jedes seiner Eingabe-Observables berechnet werden.

Die statische Version von combineLatest akzeptiert entweder ein Array von Observables oder jedes Observable kann direkt als Argument angegeben werden.

Also diese Funktion wird Ihre Array von Observablen nehmen und eine Observable eines Arrays zurückgeben.