Если я понимаю, что вы пытаетесь выполнить sh:
- Загрузить все данные из API
- Затем загрузите каждую отдельную запись из API (используя данные, которые вы получили из первого запроса API)
Для этого вам понадобится оператор switchMap()
и, вероятно, forkJoin()
или combineLatest()
функций.
/* needed imports */
import { combineLatest, forkJoin } from 'rxjs';
import { tap, switchMap } from 'rxjs/operators';
/* load all data */
this.apiService.getAllData().pipe(
/* switchMap will "switch" the observable your subscriber receives */
switchMap((response: any) => {
this.allData = response['data'];
/* we will map allData to an observables (ie: api requests) */
/* try using an arrow function here to avoid `this` conflicts */
const arrayOfObservables = this.allData.map(data => {
return this.apiService.getDataDetail(id).pipe(
tap(detail => console.log('detail: ', detail))
);
});
/* switchMap needs to return an observable */
return forkJoin(arrayOfObservables);
// could also use combineLatest(arrayOfObservables)
})
).subscribe(
(data: any[]) => {
/* important to note that data will be an array of all the
individual details received from the api */
console.log('received data: ', data);
},
err => console.log('Something wrong...', err)
);
Важно отметить, что forkJoin
не будет выдавать значение до тех пор, пока все не обнаружат наблюдаемые в массиве завершить . Это, вероятно, ваше желаемое поведение, так как вы делаете http-запросы, которые всегда выполняются, если вы используете Angular.
Если вы хотите, чтобы данные вашего подписчика передавались по мере их поступления, а не по завершении всех, тогда вам может понадобиться что-то вроде mergeMap()
. Это более сложно, и не похоже, что это то, что вы хотите здесь (хотя я могу ошибаться).
РЕДАКТИРОВАТЬ: См. Мой ответ здесь для примера mergeMap
/ concatMap
, чтобы показать, как его реализовать. Мой ответ также касается видимой очистки, чтобы избежать утечек памяти.