【发布时间】:2018-07-02 15:21:23
【问题描述】:
一开始我的印象是 combineLast 很合适,但当我阅读文档时,它似乎不是:“请注意,combineLatest 不会发出初始值,直到每个 observable 至少发出一个值。”……当然,我恰好遇到了那个例外。我尝试了forkJoin 和merge 的各种组合,但我做不到。
用例非常简单,someObs 方法返回0 或更多可观察对象,我在其上循环。基于SomeObs 对象上的值,我将一个新构造的可观察对象OtherObs[] 推送到Array 的Observable<OtherObs[]>。这个数组“需要”被合并到一个单独的 observable 中,在返回它之前我想做一些转换。
具体来说,我很难用合适的东西替换 combineLast 运算符……
public obs(start: string, end: string): Observable<Array<OtherObs>> {
return this.someObs().pipe(
mergeMap((someObs: SomeObs[]) => {
let othObs: Array<Observable<OtherObs[]>> = [];
someObs.forEach((sobs: SomeObs) => {
othObs.push(this.yetAnotherObs(sobs));
});
return combineLatest<Event[]>(othObs).pipe(
map(arr => arr.reduce((acc, cur) => acc.concat(cur)))
);
})
);
}
private yetAnotherObs(): Observable<OtherObs[]> {
/// ...
}
private somObs(): Observable<SomeObs[]> {
/// ...
}
【问题讨论】:
-
那么你的问题是什么,你想要做什么或者什么不起作用?
-
您通常可以通过将
startWith应用于每个内部可观察对象来解决 combineLatest() 限制,以便它们始终立即发出一些初始值。 -
对我来说,问题出在你的方法 yetAnotherObs() 上。这个函数返回的可观察对象似乎没有发出任何值。你可以使用任何组合运算符,但你必须确保你的 observables 发出一些东西来继续。如果能详细了解这个函数的作用,那就太好了。
标签: merge rxjs observable