我在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?
答案 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,最后你将得到普通的值。