我正在尝试使用Immutable.js中的observable和Map结构实现同步机制。
它不起作用,因为Map不能是一个可观察的,或者因为我做错了。
我试图查看Rx文档,使用just,return,from,of ...似乎没有任何东西适合Map。
我需要的是等待在完成订阅回调中的操作之前完成我的Map(使用我从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来获取Map。 在进行显示操作之前我需要有我的地图
this.topologyService.processNewTopology(endpoints).subscribe(
myMap => {
// here I want to access the content of myMap to display the new topo
}
...
);
答案 0 :(得分:0)
您将Obserable用作es6承诺。最好的解决方案是将来自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
});