2017-07-07 46 views
0
for (let i = 0; i < this.data.VirtualHosts.length; i++) { 
       // get the vh 
       this.apiService.findVH(this.data.VirtualHosts[i]) 
        // then add each vhost to data by concat and then convert to json 
        .subscribe((data) => { 
         this.data = data.docs[0] 
         this.jsonData = this.jsonData.concat(this.data) 
         //console.log("AFTER: " + this.jsonData[i]._id) 
         //console.log("Response for getVH: " + JSON.stringify(this.jsonData)) 

        }) 
      } 

在这里,我遍历VirtualHosts的ID的列表,并做他们的每一个一个get调用(findVH)。但是,get调用似乎在调用每个索引。我怎么做才能让get调用按照在this.data.VirtualHosts列表中给出的顺序返回一个数据列表?angular2-可观察正从列表中的数据按顺序

回答

0

我不会推荐在循环内部使用observable,除非您真的必须..考虑在一个API调用/ observable中获取所有数据。如果你没有退订每一个观察对象,你最终都会发生内存泄漏(除非你使用的是角度http)。

无论如何,尝试用超时包装你的代码,将其添加到事件队列:

for (let i = 0; i < this.data.VirtualHosts.length; i++) { 
setTimeout(() => { 
       // get the vh 
       this.apiService.findVH(this.data.VirtualHosts[i]) 
        // then add each vhost to data by concat and then convert to json 
        .subscribe((data) => { 
         this.data = data.docs[0] 
         this.jsonData = this.jsonData.concat(this.data) 
         //console.log("AFTER: " + this.jsonData[i]._id) 
         //console.log("Response for getVH: " + JSON.stringify(this.jsonData)) 

        }) 
}, 0); 
      } 

目前正在exeucuted服务方法之前的循环结束。

+0

感谢您的回复。使用此代码给我一个错误,并指出this.apiService.findVH的属性是未定义的。 – joshua1991

+0

尝试更新的代码 – TheUnreal

+0

仍然表明失序:( – joshua1991

0

返回值的顺序不正确,主要是由于Observables将为每个呼叫创建一个单独的线程,因此该循环在结果到达之前完成;这就是为什么无序列表。我在这种情况下做的是把它放在一个方法中,存储无序列表,然后通过运行诸如findfilter方法之类的方法将结果过滤到另一个变量,以便使用来自this.data.virtualHosts的常用值以及无序结果回到订单。