Если вам нужно сделать 6000 отдельных HTTP-вызовов, вам, возможно, придется изменить бэкэнд, чтобы вернуть всю информацию в одном запросе. Между тем, вы можете попробовать использовать оператор Rx JS switchMap
с concatMap
с from
и of
функции для выполнения запросов последовательно.
import { of, from } from 'rxjs';
import { switchMap, concatMap, finalize } from 'rxjs/operators';
public getAllNodes() {
this.dataSource.data = [];
let sites = [];
this.nodeService.getList().pipe(
switchMap(nodes => {
let requests = [];
this.dataSource.data = nodes;
nodes.forEach(node => requests.push(this.siteService.getSiteById(node.site_id)));
return from(requests);
}),
concatMap(request => of(request)),
finalize(() => {
this.dataSource.data.forEach((node, index) => node.site = sites[index]);
})
).subscribe(
site => {
sites.push(site);
},
error => {
// handle error
}
);
}
Теперь 6000 запросов будут выполняться последовательно, поэтому это будет слишком медленно.
Обновление: одновременные запросы с использованием mergeMap
Как предложил Уилл Александер в комментариях, вы можете использовать оператор Rx JS mergeMap
для одновременных запросов. Но я бы посоветовал вам оставить его меньше 6, поскольку в большинстве браузеров есть жесткое ограничение на количество одновременных запросов к уникальному домену.
Так что вы можете заменить
concatMap(request => of(request))
на
mergeMap(request => of(request), null, 5) // <-- 5 concurrent requests