Разрешить наблюдаемые свойства с помощью http-вызовов - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь написать API-интерфейс для публикации c https://pokeapi.co/ При попытке запросить покемона API не возвращает всю модель, вместо этого он возвращает URL-ссылки на дочерние элементы. .

(пытается запросить https://pokeapi.co/api/v2/pokemon/name)

вместо ожидаемого

Pokemon { 
  id,
  name,
  types[ (Actual model)
    {
      id,
      name,
      otherProperties...
    }
  ]
} 

я получаю

Pokemon { 
  id,
  name,
  types[ (Reference to the actual model)
    {
      name,
      url
    }
  ]
} 

Как мне создать метод findPokemonByName (строка: имя), который возвращает покемона root и отображает типы в виде вложенных http-запросов на https://pokeapi.co/api/v2/type/name с использованием HttpClient и rx js?

1 Ответ

0 голосов
/ 21 апреля 2020

Это предварительный просмотр службы:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { tap, switchMap } from 'rxjs/operators';
import { forkJoin } from 'rxjs';

@Injectable()
export class PokemonService {
  private baseAPIUrl = 'https://pokeapi.co/api/v2/';
  constructor(private httpClient: HttpClient) {

   }

   public getPokemonByName(name: string) {
     return this.httpClient.get(`${this.baseAPIUrl}pokemon/${name}`)
     .pipe(
       switchMap((pokemon: any) => {
         return forkJoin({
           types: forkJoin(this.generateRequestsForTypes(pokemon.types))
         })
       }, (pokemon, result) => {
         pokemon.types = result.types;
         return pokemon;
       }),
     )
   }

  private getPokemonTypeByUrl(url: string) {
    return this.httpClient.get(url);
  }

  private generateRequestsForTypes(types: any[]) {
    return types.map((type) => this.getPokemonTypeByUrl(type.type.url))
  }
}

Конечно, вы должны добавить типы, но я думаю, что это может быть хорошим началом.

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

Использовать функцию выбора результата (последний аргумент для оператора switchMap в приведенном выше примере).

stackblitz

...