У меня есть ситуация, когда мне нужно запустить цикл и получить соответствующие элементы ' description . Затем вместе с идентификаторами предметов и другой информацией я должен включить извлеченное описание в таблицу данных.
addDescription(){
this.arrayOfItems.forEach(element => {
// CALL a function which will make a service call
this.fetchDescription(element);
//CODE TO DECLARE AN INTERFACE TO ASSIGN RESPECTIVE VALUES. eg.
// ITEM_ID : element.id,
// ITEM_DEF : this.fetchedDescription.join("\n")
}
Тело функции:
fetchDescription(elementToFetchDesc){
//Declaring HTTPPARAMS in PassingParams variable
this.componentService.getDesc(PassingParams)
.subscribe((response: HttpResponse<any>) => {
if(response.status ==200){
this.fetchedDescription = reponse.body.output.slice(6,-1);
}
//Code if response status is NOT 200
}
В componentService
Сервис:
construcutor(private httpConn: HttpClient){}
getDesc(Params){
// Declare URL
return this.httpConn.get(URL, {params: Params, observe: 'response'});
}
Проблема :
Поскольку он работает в цикле, а подписка является асинхронным вызовом, то после запуска цикла в forEach
он выходит. В результате описание не назначается переменной (ITEM_DEF
) в интерфейсе.
Чтобы решить эту проблему, я внес небольшое изменение в использование promise
.
В сервис добавила:
import 'rxjs/add/operator/toPromise';
И обновил метод обслуживания как:
return this.httpConn.get(URL, {params: Params, observe: 'response'})
.toPromise(); // converted observable into promise
Также изменено в компоненте:
Внутри fetchDescription
функция:
заменено .subscribe
как .then
Но проблема все еще сохраняется. Пожалуйста, дайте мне знать, где я делаю неправильно, чтобы реализовать эту логику.