angular2-可观察正从列表中的数据按顺序
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-可观察正从列表中的数据按顺序
我认为你需要做2件事。其中这里所描述的转换成this.data.VirtualHosts可观察到的使用从运营商:
https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/from.md
然后使用concatMap这将迫使API结果在您发射了请求的顺序返回。这在这里解释:
https://www.learnrxjs.io/operators/transformation/concatmap.html
我不会推荐在循环内部使用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服务方法之前的循环结束。
感谢您的回复。使用此代码给我一个错误,并指出this.apiService.findVH的属性是未定义的。 – joshua1991
尝试更新的代码 – TheUnreal
仍然表明失序:( – joshua1991
返回值的顺序不正确,主要是由于Observables
将为每个呼叫创建一个单独的线程,因此该循环在结果到达之前完成;这就是为什么无序列表。我在这种情况下做的是把它放在一个方法中,存储无序列表,然后通过运行诸如find
或filter
方法之类的方法将结果过滤到另一个变量,以便使用来自this.data.virtualHosts
的常用值以及无序结果回到订单。
是的,我遵循你所说的,它的工作!谢谢。 – joshua1991