rxjs:过滤json字段

时间:2016-05-11 18:14:32

标签: json reactive-programming rxjs observable

我有一个基于websocket事件创建的observable。

Observable.fromEvent<Response>(websocket, 'message');

它包含像

这样的json对象
{"id": "A", "value": 123}
{"id": "B", "value": 456}
{"id": "C", "value": 789}
{"id": "A", "value": 321}

现在,我要创建三个observable,每个事件都有相同的id。 (例如,observable 1仅包含"id": "A"的事件),以便只关心"id": "A"的订阅者可以订阅特定的订阅者。

所以,我创建了像

这样的可观察对象
public GetMonitorData = (): Observable<Response> => {
     Observable.fromEvent<Response>(websocket, 'message')
           .filter(function (result, idx) {
                return JSON.parse(result)['id'] === 'A'; //syntax error at here
            });
}

并订阅

GetMonitorData().subscribe((result) => {
      // I expect all subscribed events at here are of same 'id'
      let parsedResponse = JSON.parse(result.data);
      this.updateStats(parsedResponse);
});

编辑:我希望我可以根据json对象的'id'进行过滤,但return JSON.parse(result)['id'] === 'A';会抱怨Argument of type Response is not assignable to parameter of type string。所以,我不知道如何从Observable事件中提取'id'并使用它来过滤事件。

换句话说,我有像

这样的传入观察
--A--B--A--C--B--C--->

我想创建三个可观察对象,如

--A--A-->
--B--B-->
--C--C-->

其中A, B, C是JSON 'id'值分别为A, B, C的事件。我不知道如何根据'id'值进行过滤,因为事件是可观察的,JSON.parse(result)['id']无法提取它。

1 个答案:

答案 0 :(得分:1)

问题是您正在尝试解析Object。快速查看WebSocket MessageEvent specification告诉我们有一个data属性来保存有效负载消息。

你应该需要的意思:

 //I am fairly certain Response is not what WebSocket returns so I changed this to 
 //MessageEvent, but I don't have a TS compiler to try this with right now.
 Observable.fromEvent<MessageEvent>(websocket, 'message')
       .filter(function (result, idx) {
            return JSON.parse(result.data)['id'] === 'A'; //syntax error at here
        });

为了进一步回答您的问题,您确实可以像这样拆分流,但我会将解析放入fromEvent选择器,以避免为每个订阅解析JSON的开销:

 var source = Observable.fromEvent<MessageEvent>(websocket, 'message', (e) => JSON.parse(result.data));

 var sourceA = source.filter(result => result.id === 'A');