2017-12-25 7 views
1

Angular4アプリケーションでObservablesを使用して、以下のような状況が発生しました。概要ページの予約日の概要データを収集したいとします。すべての日を取得することはObservableであり、毎日私は取得しなければならないその日の予約リストを持っています。このリストから、私はその日の要約を計算します。これらすべてのサマリーは、結果として得られる観測値で放出したいものです。RxJS:Observablesの配列の配列を調べる

私はもっと複雑なものをたくさん試しましたが、完了するまで待たずに空の要約を得たところで常に内側の観測可能なものがありました。私は基本に戻る得ている、これらの線に沿って何か作業をする必要があります:

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 
} 

しかし、summaries$の種類がObservable<Observable<BookingDaySummary>ではなく、観察可能です。だから、私はどうすればObservable<T[]>[Observable<T>]にするのですか?

また、.mapで使用している最も内側のメソッドは、Observable<T>を生成しようとするときObservableを返すか、着信タイプのマップにする必要がありますか?観察可能な[] 使用Observable.fromがそれらを一つずつを放出し、観察可能と終了あなたにを平らにし、実行するためにmergeMapが続くだろう -

+0

calculateSummaryは実際にObservableを返す必要がありますか? –

+0

@IngoBürk:それは質問の一部でした。私は両方を試みました。メソッド自体はObservable(もう1つのdbフェッチ)を使用しているので、それをする必要があります。 – EluciusFTW

答えて

0

は、私は要約が観測の配列であると仮定し

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

を試してみてください明白な価値のある排出を得るでしょう。 combineLatest documentationから

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

+0

'Observable 'はObservable 型に割り当てられません。 – EluciusFTW

+0

Observable からObservable に入力を変更するか、を使用して最初に動作するか確認してください。 –

+0

このコードスニペットでは、[説明を含む](http://meta.stackexchange。 com/questions/114762/explain-entire-code-based-answers)は本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 –

0

calculateSummaryOfDaysのあなたの最後の文にRxJS combineLatest静的関数を使用します。

return Observable.combineLatest(summaries$); 

あなたsummaries$は、観測の配列であることに注意してください

複数のObservableをcreaに結合するObservableの値は、入力Observableのそれぞれの最新の値から計算されます。

静的バージョンcombineLatestはObservablesの配列を受け入れるか、Observableのそれぞれを直接引数として入れることができます。

このように、この関数はあなたの観測値の配列をとり、配列の観測値を返します。

関連する問題