2016-04-26 6 views
8

Рассмотрим следующие два потока событий. Каждое событие имеет свойство timestamp/ts и value.Как присоединиться к двум потокам событий в общем свойстве события?

Input stream

Я хочу объединить эти два потока, где события имеют одинаковые метки времени, в результате поток с нанесенным преобразованием величины. Если в одном потоке отсутствует одна временная метка (например, желтый ts=3 в примере ниже), эту метку времени следует игнорировать.

enter image description here

Хотелось бы, чтобы решить эту проблему, используя реактивную библиотеки программирования, таких как xstream или rxjs. Я совершенно новичок в концепциях реактивного программирования, но если у кого-то есть другое предложение, я все уши. Благодаря!

+2

Мне просто нравятся ваши диаграммы! О вашей проблеме сложно вообще, я имею в виду, что вам нужно увидеть весь поток, чтобы сделать ваше соответствие, если вы не можете гарантировать заказ (т. Е. Временная метка, увеличивающая функцию времени, а это означает, что никакие значения не выходят из строя). В противном случае это может быть сделано с помощью оператора 'join' – user3743222

+0

Спасибо :) Мы можем предположить, что временные метки всегда поступают в возрастающем порядке. – hampusohlsson

+0

также было бы неплохо, если бы все значения имели разные временные метки – user3743222

ответ

3

Просто используйте combLatest и передайте только те комбинации, которые имеют соответствующую метку времени. Другие комбинации отображаются на 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.

+0

Очень чистый раствор. Спасибо! – hampusohlsson

+0

Несвязанный комментарий, Andre, OP использовал тэг 'xstream', который не имеет отношения к библиотеке потоковой передачи' xtream'. Было бы неплохо иметь для этого определенный тег. – user3743222

+0

@ user3743222 Я согласен –