Angular 8: фильтрация результатов из наблюдаемой Rx JS (из учебника Angular .io) - PullRequest
1 голос
/ 27 февраля 2020

В учебнике Angular .io («Приложение Tour of Heroes») они используют этот код для возврата массива объектов из службы:

https://angular.io/tutorial/toh-pt6#tap -into-the -observable

/** GET heroes from the server */
getHeroes (): Observable<Hero[]> {
  return this.http.get<Hero[]>(this.heroesUrl)
    .pipe(
      tap(_ => this.log('fetched heroes')),
      catchError(this.handleError<Hero[]>('getHeroes', []))
    );
}

Однако, если вам нужно вернуть наблюдаемый с один результат , они предполагают, что API предоставляет эту услугу (т. е. API принимает параметр id).

Однако что если вместо этого вы хотите, чтобы ваша служба приняла параметр id, а затем фильтр результаты выполнения вышеуказанной функции:

Например, в псевдокоде:

getHero(id: number): Observable<Hero> {
  // call getHeroes (as above)
  // filter the results to return only the here who's id property matches the id parameter;
  this.getHeroes().[filter this somehow, and return an observable with just the match]
}

Как вы выполняете sh это?

Извините заранее - я нашел подобные вопросы здесь, но либо они полагаются на более старую версию Angular / Rx JS, либо они не совсем верны учебнику (например, функция возвращает массив вместо наблюдаемого. ..)

1 Ответ

3 голосов
/ 27 февраля 2020

Это функция отображения - вы берете объект определенной формы (массив из n результатов) и хотите отобразить его на объект другой формы (один объект).

Для для этого вы можете использовать оператор map в трубе.

getHero(id: number): Observable<Hero> {
  return this.getHeroes().pipe(
    map(heroes => heroes.find(x => x.id === id))
  );
}
...