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

rxjs: filter observable by json field

我有一个基于 websocket 事件创建的可观察对象。

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

它包含 json 个像

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

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

所以,我创建了 observable like

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'] 无法提取它。

问题是您正在尝试解析 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');