我有来自rabbitMQ的一系列事件,看起来像是
Event: {id, type, timestamp}
。
价值观是:
id
:一些独特的字符串
type
:( a)rrive /(d)epart
我想生成一个新的事件流,其中我将到达事件与每个id的离开事件(连续)匹配。可以显示具有相同ID的事件 例如,给定一个事件流:
id | type | time
1 | a | 0
1 | d | 1
2 | a | 2
3 | a | 3
3 | d | 4
1 | a | 5
2 | d | 6
1 | d | 7
我会生成一个Correlated:{id, duration}
类型的新流:
其中duration
是两个相关事件的时间戳差异
id | duration
{1, 1}
{3, 1}
{2, 4}
{1, 1}
我已经能够通过id对传入的流进行分组,但是无法找到任何关于事件与另一个事件相关的文档。我正在使用RxJS
答案 0 :(得分:1)
假设在img {
max-height: 240px;
margin: 0 auto;
}
.app-container {
width: 500px;
margin: 30px auto;
}
.clear {
clear: both;
}
.details,
.title {
text-align: center;
}
.error {
margin-top: 4px;
color: red;
}
.has-error {
border: 1px dotted red;
}
.image-container {
align-items: center;
display: flex;
width: 85%;
height: 80%;
float: left;
margin: 15px 10px 10px 37px;
text-align: center;
}
.preview-container {
height: 335px;
width: 100%;
margin-bottom: 40px;
}
.placeholder-preview,
.render-preview {
text-align: center;
background-color: #efebeb;
height: 100%;
width: 100%;
border-radius: 5px;
}
.upload-container {
cursor: pointer;
height: 300px;
}
之后到达时离开,您可以使用groupBy
来组合连续的事件,pairwise
仅考虑离开,filter
来计算持续时间,像这样:
map
const source = Rx.Observable.of(
{ id: 1, type: "a", time: 0 },
{ id: 1, type: "d", time: 1 },
{ id: 2, type: "a", time: 2 },
{ id: 3, type: "a", time: 3 },
{ id: 3, type: "d", time: 4 },
{ id: 1, type: "a", time: 5 },
{ id: 2, type: "d", time: 6 },
{ id: 1, type: "d", time: 7 },
Rx.Scheduler.async
);
const grouped = source
.groupBy(event => event.id)
.mergeMap(group => group
.pairwise()
.filter(([, last]) => last.type === "d")
.map(([prev, last]) => ({
id: last.id,
duration: last.time - prev.time
}))
);
grouped.subscribe(value => console.log(value));
.as-console-wrapper { max-height: 100% !important; top: 0; }