Чего я хочу добиться: Выполнять вызовы из component.ts в сервис this.getMatches, в this.getMatches Мне нужно сделать несколько вызовов API и работать с данными, которые я получаю, прежде чем они будут отправлены в массив
Что я сделал: 1: функция запускается и отправляет "gameId" в качестве аргумента функции this.getmatches. Я получаю массив каждого совпадения со всеми данными, которые я отправлял в каждое совпадение 2: я смог найти метод, который работал после многих попыток, но он не удался при возврате в массив
Проблема: Иногда он возвращает то же совпадение, я заметил, что это происходит, когда я добавляю оператор "swtichmap".
return
Сервисы. ts
@Injectable({
providedIn: 'root'
})
export class SummonerService {
constructor( private http:HttpClient ) { }
summonerName
dataMatch
matchParticipants
matchHistory = [];
getSummoner(summonerName,regionId){
this.summonerName = summonerName
return this.http.get(`http://localhost:3000/summName/${summonerName}/${regionId}` )
};
getMatches(gameId){
return this.http.get( `http://localhost:3000/match/${gameId}`
).pipe(
tap( (data:any) => {
console.log(data.match);
this.dataMatch = data.match
this.matchParticipants = data.match.participants
}) ,
switchMap( data => {
return this.http.get(`http://ddragon.leagueoflegends.com/cdn/10.5.1/data/en_US/summoner.json`)
}),
tap( (data:any) =>{
let spellsObj = data.data;
const spellsArray:Array<any>[] = [];
Object.keys(spellsObj).forEach( key =>{
let spell = spellsObj[key]
spellsArray.push(spell)
});
this.matchParticipants.forEach( participants => {
let spellId1:any = spellsArray.find( (spell:any) => spell.key === JSON.stringify(participants.spell1Id) );
let spellId2:any = spellsArray.find( (spell:any) => spell.key === JSON.stringify(participants.spell2Id) );
let spellId1Image = `http://ddragon.leagueoflegends.com/cdn/10.5.1/img/spell/${spellId1.id}.png`
let spellId2Image = `http://ddragon.leagueoflegends.com/cdn/10.5.1/img/spell/${spellId2.id}.png`
participants.spellId1Info = spellId1
participants.spellId2Info = spellId2
participants.spellId1Info.image = spellId1Image
participants.spellId2Info.image = spellId2Image
});
}),
map ( data =>{
return this.dataMatch
})
)};
Я поместил часть кода, но мне нужно сделать больше звонков, как это.
switchMap( data => {
return this.http.get(`http://x.json`)
}),
Я не знаю, был ли здесь правильный вызов с «картой переключения», либо
Component.ts
onSubmit( ){
this.summ.getSummoner( this.summoner.name,this.summoner.regionId )
.pipe(
tap( (summoner:any) => this.matchHistory = summoner.matchHistory ),
concatMap( (summoner:any) => {
const observables = this.matchHistory
.map( element => this.summ.getMatches(element.gameId));
return forkJoin(observables)
}),
map( (matchesArray:any) => {
let gameIdArray = this.matchHistory.map( element => element.gameId)
this.matchesArray = matchesArray.sort((a, b) => {
return gameIdArray.indexOf(a.gameId) - gameIdArray.indexOf(b.gameId);
});
return matchesArray
})
) .subscribe();