我有一个基于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 回答
问题是你正在尝试解析
Object
. 快速查看WebSocket MessageEvent specification告诉我们有一个data
属性来保存有效负载消息 .你需要的意思是:
为了进一步回答您的问题,您确实可以像这样拆分流,但我会将解析放入
fromEvent
选择器,以避免为每个订阅解析JSON的开销: