angular2-可观察从列表中无序获取数据

时间:2017-07-07 15:03:20

标签: angular typescript rxjs observable

    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列表中给出的顺序返回数据列表?

3 个答案:

答案 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将为每个调用创建一个单独的线程,因此循环在结果到达之前完成;这就是为什么无序列表。我在这种情况下所做的是将它放在一个方法中,存储无序列表,然后通过运行类似findfilter方法的方法将结果过滤到另一个变量来使用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