вы делаете это неправильно, если у вас есть несколько запросов, а затем используйте mergeMap
, сейчас проблема с вашим кодом заключается в том, что вы делаете асинхронный вызов для каждого идентификатора, и каждый занимает разное время для завершения (так что если вы хотите затем вы должны поместить данные в один массив и отсортировать их, нижеприведенное решение сделает это и для вас)
В вашем первом методе listTabs()
, код как показано ниже
const ids = [];
for (let i=0; i<this.tabsList.length; i++){
ids.push(this.tabsList[i].id);
}
this._dataService.getManufacturerFields(ids)
.subscribe(item => {
this.items.push(item);
/*
sort items by original IDs order
because responses might arrived in unordered fashion
due to network conditions
*/
this.items.sort((a: Item, b: Item) => {
const aIndex = ids.findIndex(id => id === a.id);
const bIndex = ids.findIndex(id => id === b.id);
return aIndex - bIndex;
})
});
в вашем методе обслуживания, вы можете код как показано ниже
getManufacturerFields(ids: number[]): Observable<any> {
return from(ids).pipe(
mergeMap(id => <Observable<any>> this.httpClient.get(`item/${id}`))
);
}
Теперь, если вы хотите организовать по идентификатору, тогда вы должны сделать
Вы также можете использовать метод forkJoin
, который выдает выходные данные при отправке запроса, но проблема с этим методом заключается в том, что он ожидает, когда все запросы будут конкурировать.
getManufacturerFields(ids: number[]): Observable<any> {
return <Observable<any>> forkJoin(
ids.map((id) => {
return <Observable<Post>> this.httpClient.get(`item/${id}`);
})
).pipe(concatAll());
}
вот статья может вам помочь: https://blog.angularindepth.com/practical-rxjs-in-the-wild-requests-with-concatmap-vs-mergemap-vs-forkjoin-11e5b2efe293