我有一个基于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']
无法提取它。
答案 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');