如何在一个公共事件 属性 上加入两个事件流?
How to join two event streams on a common event property?
考虑以下两个事件流。每个事件都有一个 timestamp/ts 和值 属性。
我想将事件具有相同时间戳的这两个流组合成一个结果流,并应用值转换。如果一个流缺少一个时间戳(例如下面示例中的黄色 ts=3
),则应忽略该时间戳。
想使用 xstream or rxjs 等响应式编程库解决问题。我对反应式编程的概念还很陌生,但如果有人有其他建议,我会洗耳恭听。谢谢!
只需使用 combineLatest 并仅传递那些具有匹配时间戳的组合。其他组合映射到 null
,您稍后将其过滤掉。
这是 xstream 中的解决方案:
var streamOut = xs.combine(
(a, b) => {
if (a.ts === b.ts) {
return {ts: a.ts, value: a.value + b.value};
} else {
return null;
}
},
streamA, streamB
).filter(x => x !== null);
在 JSBin 中检查 运行: https://jsbin.com/saxawatuza/edit?js,console.
考虑以下两个事件流。每个事件都有一个 timestamp/ts 和值 属性。
我想将事件具有相同时间戳的这两个流组合成一个结果流,并应用值转换。如果一个流缺少一个时间戳(例如下面示例中的黄色 ts=3
),则应忽略该时间戳。
想使用 xstream or rxjs 等响应式编程库解决问题。我对反应式编程的概念还很陌生,但如果有人有其他建议,我会洗耳恭听。谢谢!
只需使用 combineLatest 并仅传递那些具有匹配时间戳的组合。其他组合映射到 null
,您稍后将其过滤掉。
这是 xstream 中的解决方案:
var streamOut = xs.combine(
(a, b) => {
if (a.ts === b.ts) {
return {ts: a.ts, value: a.value + b.value};
} else {
return null;
}
},
streamA, streamB
).filter(x => x !== null);
在 JSBin 中检查 运行: https://jsbin.com/saxawatuza/edit?js,console.