我正在研究rxjs项目,并且正在使用json-server作为数据库提供程序。我被困在获取一个我需要填充另一个收藏的收藏中。
我有收藏集比赛和收藏集比赛。 在集合Match中,我仅具有TournamentId,但我的类Match也包含Tournament实例。
class Match{
id:number;
...
tournamentId:number;
tournament: Tournament;
}
class Tournament{
id:number;
...
name:String;
}
我需要2个来自数据库的呼叫。首先获得所有比赛,然后获得所有比赛。
我需要返回比赛已填充的 Mob Observable 。
get(): Observable<Match> {
return Observable.create(obs => {
tournamentService.get().pipe(toArray()).subscribe(tournaments => {//tournaments = [torunament1, tournament2]
super.get().pipe(map(x => { let m = new Match(x); m.populateTournament(tournaments); obs.next(m); return m; })).subscribe(() => {
obs.complete();
});
});
});
}
obs.complete()被立即调用,因此我最终只能创建一个可观察的Match。 我正在尝试在地图管道中填充“比赛与比赛”,然后将其作为 obs.next(m)发送。我也不知道那是否很聪明。
tournamentService.get()和 super.get()分别返回 Tournament 和未填充匹配的可观察值(具有相同属性的JS {object})。
在将它们全部发送到订户呼叫complete()之后,next()如何一一匹配?
答案 0 :(得分:0)
您不应该创建自己的可观察对象,因为已有可用于该对象的运算符。我认为mergeMap,switchMap和CombineLatest都可以在这里工作。
您应该结合使用这两个可观察变量:
get(): Observable<Match> {
return combineLatest([super.get(), tournamentService.get()]) // Combine both Observables when both emit
.pipe(map(([match, tours])=> { // Destructuring array of emitted values
let m = new Match(match);
m.populateTournament(tours);
return m; // Return match combined with tournaments
}))
}
答案 1 :(得分:0)
我也设法通过'withLatestFrom'管道解决了这个问题。
get(): Observable<Match> {
let matchesObs = super.get();
let tournamentsObs = tournamentService.get().pipe(toArray());
return matchesObs.pipe(
withLatestFrom(tournamentsObs),
map(([m, t]) => {
let match = new Match(m as Match);
match.populateTournament(t as Tournament[]);
return match;
})
);
}