По сути, ваш пример можно свести к двум шагам:
- Получить данные из наблюдаемой
- Выполнить набор вызовов на основе данных от 1.
Я бы рекомендовал все время придерживаться наблюдаемых, если нет веских причин для использования обещаний.
- Сделайте начальный вызов, как вы делаете 1a. Переключитесь на новую наблюдаемую команду, используя
concatMap
- Создайте массив наблюдаемых и запустите параллельно, используя
forkJoin
onSubmit() {
this.summ.getSummoner(this.summoner.name, this.summoner.regionId)
.pipe(
tap((summoner) => this.matchHistory = summoner.matchHistory),
concatMap((summoner: any) => {
const observables = this.matchHistory
.map(element => this.summ.getMatches(element.gameId));
return forkJoin(observables)
}),
map(matchesArray => {
// TODO: perform sorting
return matchesArray;
})
).subscribe(matchesArray => {
});
}
Я упустил вашу сортировку, чтобы сделать ответ простым.
matchesArray
- это массив результатов, отражающих ввод observables
.
Любая сортировка, которую вы хотите выполнить, может быть выполнена с помощью оператора map
.
Any состояние, которое вы хотите сохранить из канала, может быть выполнено с помощью оператора tap
.
Ключом к объединению наблюдаемых является помнить, что существует только один подписчик верхнего уровня. Observables можно комбинировать практически любым способом, который вы можете использовать с помощью операторов pipe. Вот почему я рекомендую придерживаться наблюдаемых. Они более мощные, чем обещания в сложном сценарии ios.