如何关联无限流中的开始/结束事件?

时间:2017-10-25 02:40:00

标签: rxjs reactive-programming

我有来自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

1 个答案:

答案 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; }