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 call(findVH)。但是,get调用似乎是在调用每个索引。如何使get调用以this.data.VirtualHosts列表中给出的顺序返回数据列表?
答案 0 :(得分: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);
}
目前for循环在您的服务方法被执行之前结束。
答案 1 :(得分:0)
返回值的顺序不正确主要是因为Observables
将为每个调用创建一个单独的线程,因此循环在结果到达之前完成;这就是为什么无序列表。我在这种情况下所做的是将它放在一个方法中,存储无序列表,然后通过运行类似find
或filter
方法的方法将结果过滤到另一个变量来使用this.data.virtualHosts
和无序结果使它们恢复正常。
答案 2 :(得分:0)
我认为你需要做两件事。使用from运算符将this.data.VirtualHosts转换为observable,如下所述:
https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/from.md
然后使用concatMap,它将强制api结果按照您触发请求的顺序返回。这在这里解释:
https://www.learnrxjs.io/operators/transformation/concatmap.html