I am a beginner with Angular and TypeScript, so I am creating my own application using the public Pokemon API for practice. However, I want some feedback on the task to use http to get information on the pokemons with ids between [1, 50]. To get the Pokemon for each id, I need a separate http GET request. As a result, I have 50 Observable objects that I need to subscribe to and then generate an array out of the results from all 50 Observables. However, I want some advice on if there exists a better way to achieve what I am hoping to.
poke-dashboard.component.ts (Code to subscribe to 50 Observables)
import { Component, OnInit } from '@angular/core';
import { PokemonService } from '../services/pokemon.service';
import { Pokemon } from '../shared/pokemon';
@Component({
selector: 'app-poke-dashboard',
templateUrl: './poke-dashboard.component.html',
styleUrls: ['./poke-dashboard.component.scss'],
})
export class PokeDashboardComponent implements OnInit {
pokemons: Pokemon[];
constructor(private pokemonservice: PokemonService) {}
ngOnInit(): void {
let pokemonsList: Pokemon[] = [];
for (var i = 1; i <= 50; i++) {
this.pokemonservice.getPokemonForId(i).subscribe((data: any) => {
pokemonsList.push(this.pokemonservice.generatePokemon(data));
});
}
this.pokemons = pokemonsList;
}
}
pokemon.service.ts (Code to handle http calls)
import { Injectable } from '@angular/core';
import { Pokemon } from '../shared/pokemon';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class PokemonService {
baseUrl: string;
private pokemons: Pokemon[] = [
new Pokemon(
'pikachu',
'pikachu',
90,
50,
50,
40,
55,
35,
'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/25.png'
),
];
constructor(private httpClient: HttpClient) {
this.baseUrl = 'https://pokeapi.co/api/v2/';
}
public getPokemonForId(id: number): Observable<any> {
return this.httpClient.get(this.baseUrl + `pokemon/${id}`);
}
public generatePokemon(pokeinfo: any): Pokemon {
return new Pokemon(
pokeinfo['name'],
pokeinfo['species']['name'],
pokeinfo['stats'][0]['base_stat'],
pokeinfo['stats'][1]['base_stat'],
pokeinfo['stats'][2]['base_stat'],
pokeinfo['stats'][3]['base_stat'],
pokeinfo['stats'][4]['base_stat'],
pokeinfo['stats'][5]['base_stat'],
pokeinfo['sprites']['front_default']
);
}
public getPokemons() {
return this.pokemons;
}
}