如何用另一个可观察对象填充可观察对象并返回可观察对象

时间:2019-04-20 09:54:51

标签: typescript rxjs observable

我正在研究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()如何一一匹配?

2 个答案:

答案 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;
      })
    );
  }