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);
                }
            });


        });

Имейте в виду, я не запускал этот код, он просто для иллюстрации.

Другие вопросы по тегам