使用不可变Map结构作为Observable

时间:2017-06-22 09:00:21

标签: javascript typescript observable immutable.js

我正在尝试使用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
          }
          ...
        );

1 个答案:

答案 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
    });