Как заполнить наблюдаемое другим наблюдаемым и вернуть наблюдаемое - PullRequest
0 голосов
/ 20 апреля 2019

Я работаю над проектом rxjs и использую json-сервер в качестве поставщика базы данных.Я застрял при получении одной коллекции, которую мне нужно заполнить другой коллекцией.

У меня есть коллекция Match и коллекция Tournament .Внутри коллекции Match у меня есть только tourId, но мой класс Match также содержит экземпляр Tournament.

class Match{
    id:number;
    ...
    tournamentId:number;
    tournament: Tournament;
}

class Tournament{
    id:number;
    ...
    name:String;
}

Мне нужно 2 звонка из дБ.Сначала, чтобы получить все турниры, а затем получить все совпадения.

Мне нужно вернуть Наблюдаемый матч , который был заполнен Турниром.

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) .Я тоже не знаю, разумно ли это.

tourService.get () и super.get () вернуть наблюдаемые значения Турнир и незаполненное совпадение соответственно (JS {объект} с одинаковыми атрибутами).

Как мне выполнить next () совпадения одно за другим и после того, как все они отправлены абоненту, вызов завершен ()?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Мне удалось решить проблему и с каналом 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;
      })
    );
  }
0 голосов
/ 20 апреля 2019

Вы не должны создавать свои собственные наблюдаемые, уже есть операторы, которые вы можете использовать для этого.Я думаю, что MergeMap, SwitchMap и комбинироватьПоследний все работают здесь.

Вы должны объединить эти две наблюдаемые:

  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
    }))
  }
...