У меня есть проект Angular 6, где я получаю массив строк, и мне нужно вызвать бэкэнд-сервис с каждым элементом в массиве.
Код компонента (упрощенный) выглядит следующим образом:
items: any[] = ['one','two','three']
for (let item of this.items) {
this.dataSvc.searchItems(item)
.subscribe(
data => {
console.log(item, data);
})
}
И код службы Angular, подобный следующему:
public searchItems(item: string): Observable<any> {
let params = new HttpParams();
params = params.append('item', item);
return = this.httpClient.get(SERVER_API, { params: params })
}
Это прекрасно работает с одним элементом в массиве, однако, когда массив масштабируется, служба начинает выдавать ошибки тайм-аута и возвращать некоторые,но не все результаты.
У меня раньше были проблемы с этим бэкэндом, а в других областях, где у меня есть фиксированный список элементов, которые не будут меняться, я заковал в код статическую серию Обещанийтак что я жду вызова службы каждый раз, пока не вернется предыдущий результат, однако я не уверен, как выполнить то же самое в цикле.
Вот как я справился с цепочкой обещанийв другом месте с оберткой Promise в компоненте:
fetchService(item): Promise<any> {
return this.dataSvc.searchItems(item)
.toPromise();
}
this.fetchService('one')
.then(data => {
console.log("one", data);
return this.fetchRegCodeLit('two')
}).then(data => {
console.log("two", data);
return this.fetchRegCodeLit('three')
}).then(data => {
console.log("three", data);
})
Массив items является динамическим, он может содержать 10 или 100 элементов, и мне нужно иметь возможность передавать каждый элемент втот же сервис и гарантирую, что я получил ответ и обработал его перед повторным вызовом сервиса, но я не могу понять, как это сделать.
Я смотрю на async / await, и ядумаю, в этом и заключается решение, но любая попытка перестановки кода, которую я пробовал, приводит к ошибкам компиляции, поэтому я явно что-то упускаю.