2017-06-22 62 views
0

我試圖用Immutable.js實現與observable和Map結構的同步機制。使用immutable Map結構作爲Observable

這不起作用,因爲地圖不可能是可觀察的,也可能是因爲我做錯了。

我試圖查看Rx文檔,只使用,返回,從...的東西似乎沒有適合一個地圖。

我需要的是等待我的地圖完成之前(我從http.GET獲得的值),然後再執行我在訂閱回調中的操作。


import {List, Map} from 'immutable'; 
import {Observable} from 'rxjs/Observable'; 
... 

processNewTopology(topology: List<Endpoint>): Observable<Map<string, any>> { 

    let ip: string = JSON.stringify(topology.get(0).ueIpAddress); 

    //this function is just a http GET that returns an osbervable string (imsi) 
    this.apiService.getImsiFromAAA(ip).subscribe(
      imsi => myMap = this.reduceEndpointsToMap(imsi, topology), 
      error => this.errorMessage = <any>error 
     ); 

    return myMap; // I need in some way to convert my map into an obervable 

    } 


private reduceEndpointsToMap(imsi: string, topology: List<Endpoint>): Map<string, any> { 
    // this function take the imsi and a list point and build the map and return it 
    // the imsi is provided by http.GET 
} 

因此,在另一個類我稱之爲processNewTopology拿到地圖。 我需要做你正在使用Obserable作爲ES6無極顯示行動

this.topologyService.processNewTopology(endpoints).subscribe(
      myMap => { 
      // here I want to access the content of myMap to display the new topo 
      } 
      ... 
     ); 

回答

0

之前有我的地圖。最好的解決方案是將來自api服務的http請求包裝到Promise中。當http請求完成後,您可以輕鬆解決結果。

服務:

class TopologyService { 

    private apiService: any; 

    ... 

    public processNewTopology(topology: List<Endpoint>): Promise<Map<string, any>> { 
     let ip = JSON.stringify(topology.get(0).ueIpAddress); 

     return new Promise((resolve, reject) => { 
      this.apiService.getImsiFromAAA(ip).subscribe(
       response => resolve(this.reduceEndpointsToMap(response, topology)), 
       error => reject(error) 
      ); 
     }); 
    } 

    private reduceEndpointsToMap(imsi: string, topology: List<Endpoint>): Map<string, any> { 
     ... 
    } 

    ... 
} 

用法:

topologyService.processNewTopology(endpoints) 
    .then(value => { 
     // do something 
    }) 
    .catch(err => { 
     // error occured 
    }); 
+0

非常感謝您!有效。 – Charles