RxJS:Observables数组的可观察数组

时间:2017-12-25 22:47:28

标签: typescript merge rxjs observable

我在Angular4应用程序中使用Observables时出现以下情况:我无法开始工作:我想收集所有预订日的摘要数据以获取概述页面。得到所有的日子是一个Observable,每天都有一个我必须检索的当天预订列表 - 再次是一个可观察的来源。从这个列表中我计算出当天的摘要。所有这些摘要我想在一个可观察的结果中发出。

我已经尝试了许多更复杂的事情,但总是内部的观察者没有等待完成,我得到了空的摘要。我已经回到了基础,这些方面的东西应该有效:

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。所以这一切归结为:如何从Observable<T[]>制作[Observable<T>]

另外:我在.map中使用的最内部方法是否应该返回一个Observable,或者只是在打算生成Observable<T>时将传入类型的地图设置为T?

3 个答案:

答案 0 :(得分:2)

combineLatest的上一个语句中使用RxJS calculateSummaryOfDays静态函数:

return Observable.combineLatest(summaries$);

请注意,您的summaries$是一个可观察数组:

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

来自combineLatest documentation

  

组合多个Observable以创建一个Observable,其值是根据每个输入Observable的最新值计算的。

     

combineLatest的静态版本接受一个Observable数组,或者每个Observable都可以直接作为参数。

因此,这个函数将获取你的observable数组并返回一个可观察的数组。

答案 1 :(得分:1)

  

如何从Observable []使Observable

forkJoin执行此操作。在T上使用String:

import { of, forkJoin} from 'rxjs';
import { Observable } from 'rxjs'

const source:Array<Observable<String>> = [of('A'), of('B'), of('C') ];

const source2:Observable<String[]> = forkJoin(source);

source2.subscribe((res=>console.log(res)));

https://stackblitz.com/edit/arrayofobs2obsofarray?file=index.ts

答案 2 :(得分:0)

尝试

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

我认为摘要是一个可观察的数组 - Observable [] 使用Observable.from将逐个发出它们,然后使用mergeMap来展平并执行Observable,最后你将得到普通的值。