2017-09-12 101 views
1

我正在使用mergeMap產生一批查詢來找出基於點的地址。我將每個響應映射到數組中的對象。mergeMap完成太早

//ptosDistintos = ['-34.5466 58.4363', '-34.5523 58.4486', ...] 
this.suscCalcularDirecciones = Observable.from(ptosDistintos) 

    .mergeMap(pos => { 

     //I convert every position to a latLng object (Leaflet) 
     const [lat, lng] = pos.split(' '); 
     const latlng = L.latLng(+lat, +lng); 

     //I make requests to Google to figure out addresses 
     return this.http.get(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latlng.lat},${latlng.lng}`) 
      .filter(x => x.length) 
      //I return the address to the mergeMap. 
      .map(direccion => 
       [pos, direccion.length ? direccion[0].formatted_address : '(no encontrada)']; 
      ); 
    }) 
    .finally(() => { 

     //I'm deleting the suscription once it is complete because in template I check for completion by checking emptyness of the subscription. 
     delete this.suscCalcularDirecciones; 
    }) 
    .subscribe(posDir => { 
     const [pos, dir] = posDir; 
     for (let i of agrup[pos].indexes) { 
      this.historico[i].direccion = dir; 
     } 
     this.historico = this.historico.slice(); 
    }); 

但是,mergeMap生成的observable完成得太早。 「finally」指令在幾個(如果不是第一個)「nexts」之後執行。在對Google完成所有查詢後,我可以做些什麼來調用它?

+0

你可以做一個演示?代碼看起來很好,除了'delete this.suscCalcularDirecciones'。你不需要這樣做。 – martin

+0

我這樣做是因爲我喜歡通過檢查訂閱的空白來檢查html中的完成情況。我知道如果我刪除那條線,這不會帶來任何困難。我的問題是指爲什麼會發生這種情況。 我試圖做一個演示,但我有問題在stackoverflow片段工具中導入Rxjs。 :( – Umagon

+0

你可以使用這個模板http://jsbin.com/bumeroq/2/edit?html,js輸出 – martin

回答

2

最終,這是Google API的一個問題。

.filter(x => x.length) 

這條線移除了從谷歌0的結果,因此合併是有很多失敗的完成響應。這是因爲Google不允許每秒發出如此多的請求(我同時做了所有這些請求,有時它們有數百個)。

enter image description here

我添加了一個計時器,可觀察所以它是隨着時間的推移請求。

Observable.timer(0, 100) 
    .map(i=>ptosDistintos[i]) 
    .take(ptosDistintos.length) 
    .mergeMap(... 

希望這有助於某人。我將添加google apis標記。