У меня есть базовая служба, настроенная для работы в качестве наблюдаемой.
Я внедрил службу в компонент, который подписывается на следующий метод службы, который запускает HTTP-запрос данных:
listApi(params:any) Observable<any[]> {
...
return this.http.get(params.url, ampOptions)
.map(data => this.listExtract(response, params))
.catch(this.handleError);
}
Мне нужно перебрать и преобразовать ответ таким образом, чтобы он гарантированно завершил до возврата его моему компоненту.
Для достижения этой цели я попытался использовать функцию async
с await
и Promise.all
:
async listExtract(response:any, params:any) {
let newArray:any = [];
await Promise.all(response.map((item, index) => {
if(item.id === params.id) {
// make changes to specific item if it's id is a match
item.label = 'selected';
}
newArray.push(item);
});
// i am assuming the above promise.all is guaranteed
// to complete before returning the new array, correct??
return newArray;
}
В моем компоненте я подписываюсь на метод listApi
в моем сервисе:
this.listService.listApi(params)
.subscribe(
response => this.listServiceResponse(response),
error => this.serviceError = <any>error);
Ответ появляется , чтобы пройти правильно, но поскольку я использую обещание для преобразования данных, он обернут в объект под названием ZoneAwarePromise
:
listServiceResponse(response) {
// because i used an async function in the service,
// Angular returns the response wrapped in an
// object titled ZoneAwarePromise
console.log('response:',response);
}
Если мой подход, описанный выше с использованием функции async , действителен для предварительного преобразования данных, как мне правильно получить этот ответ? Или я должен идти об этом совершенно по-другому?
Я мог бы просто извлечь ответ из объекта ZoneAwarePromise
, но это не кажется надежным, и просто в качестве примера следующее работает , но это не может быть правильным способом иди об этом:
listServiceResponse(response) {
// attempt to use a .then to extract the data
response.then((extractedArray) => {
console.log('response:',extractedArray);
}
}
Есть ли другой подход, который, возможно, использует более сложный метод отображения?
ЛЮБЫЙ очень признателен за помощь.