В приложении Angular у меня есть компонент, который подписывается на Observable в сервисе.
this.listService.listApi(params)
.subscribe(
response => this.listServiceResponse(response),
error => this.serviceError = <any>error);
В сервисе наблюдаемое делает http-запрос. Мне нужно перебрать ответ и построить массив результатов на основе некоторых вычислений, которые в конечном итоге будут возвращены компоненту.
Для ясности я упростил результирующий массив здесь, так как мой намного сложнее, но суть в том, что я достиг этого, используя функцию карты. Вот соответствующие части методов в сервисе:
listApi(params:any) Observable<any[]> {
...
return this.http.get(params.url, ampOptions)
.map(data => this.listExtract(response, params))
.catch(this.handleError);
}
listExtract(response:any, params:any) {
let successArray:any = [];
let failedArray:any = [];
let filteredArray:any = [];
let itemFound:boolean = false;
response.map((item, index) => {
if(item.rank > params.rank) {
filteredArray.push(item);
if(item.id === params.id) {
itemFound = true;
}
}
});
// are the following lines guaranteed to wait for the map function to finish?
if(itemFound === true) {
// do some additional calculations and construct the successArray
// then push the filteredArray onto my successArray;
successArray.push(filteredArray);
return successArray;
} else {
// do some additional calculations and construct the failedArray
// then push the filteredArray onto my failedArray;
failedArray.push({flag:'failed',id:params.id});
failedArray.push(filteredArray);
return failedArray;
}
}
Этот , по-видимому, работает правильно, но можно ли предположить, что функция map
является синхронной, и последующие строки гарантированно будут выполнять только после функции карты завершается