Angular2- Асинхронные вложенные вызовы API
this.obsData
.concatMap((vhosts) => this.apiService.findVH(vhosts))
.subscribe((data) => {
this.data = data.docs[0]
this.data.Locations.forEach((loc, index) => {
if (loc.ip=== undefined) {
this.apiService.findLocation(loc)
.subscribe((data) => {
this.data = data.docs[0]
this.idIP = this.data.ip;
loc.ip== this.idIP ;
})
}
});
this.jsonData = this.jsonData.concat(this.data);
});
Здесь я получаю данные от каждого виртуального хоста и объединяю их во весь массив с именем jsonData, который будет иметь все местоположения каждого виртуального хоста. Внутри Location есть переменная IP, и некоторые из них не определены. Вот почему у меня есть оператор if, чтобы проверить, не определены ли они. Если они действительно не определены, я делаю более тщательный поиск внутри каждого местоположения и получаю соответствующее IP-имя. Затем я устанавливаю loc.ip соответствующее имя this.data.IP. Однако массив jsonData объединяет данные, не дожидаясь, пока я установлю неопределенное имя ip, поскольку они асинхронные. Как я могу заставить jsonData ждать объединения, пока все ips местоположения не будут неопределенными?
1 ответ
Трудно дать хороший ответ, так как ваш код не может быть запущен как есть. Насколько я понял, вы можете попытаться добавить после каждой итерации, также предполагая, jsonData
быть массивом:
this.jsonData = []; //or however it is initialized
this.obsData
.concatMap((vhosts) => this.apiService.findVH(vhosts))
.subscribe((data) => {
//this.data = data.docs[0]
let dat = data.docs[0];
this.data.Locations.forEach((loc, index) => {
if (loc.ip=== undefined) {
this.apiService.findLocation(loc)
.subscribe((data) => {
//this.data = data.docs[0]
dat = data.docs[0]
this.idIP = this.data.ip;
loc.ip== this.idIP ;
this.jsonData.append(dat);
})
} else {
this.jsonData.append(dat);
}
});
});
Имейте в виду, я не запускал этот код, он просто для иллюстрации.