首页 文章

rxjs:过滤json字段可观察到的

提问于
浏览
1

我有一个基于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" 的订阅者可以订阅特定的订阅者 .

所以,我创建了observable

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

编辑:我希望我可以根据 'id' 的json对象进行过滤,但 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 回答

  • 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');
    

相关问题