2017-07-07 83 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的常用值以及無序結果回到訂單。