Angular2-异步嵌套API调用

时间:2017-07-20 19:51:17

标签: angular http angular2-forms asynchronous-javascript

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

在这里,我从每个vhost获取数据并将它们连接到一个名为jsonData的整个数组,该数组将包含每个vhost的所有位置。位置中有一个名为IP的变量,其中一些是未定义的。这就是为什么我有if语句来检查它们是否未定义。如果它们确实未定义,我会在每个位置内进行更彻底的搜索并获得相应的IP名称。然后我将loc.ip设置为适当的this.data.IP名称。但是,jsonData数组连接数据而不等待我设置未定义的ip名称,因为它们是异步的。如何让jsonData等待连接,直到所有的位置ips都没有被定义?

1 个答案:

答案 0 :(得分:0)

由于您的代码无法按原样运行,因此难以提供良好的答案。据我所知,您可以尝试在每次迭代后追加,同时假设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);
                }
            });


        });

请注意,我没有运行此代码,仅仅是为了说明。