2015-09-25 117 views
2

我有以下流事件同步

T1---T2---T3---T4---T5---T6---T7---T8 
Q1-Q3-Q7-Q10 

我想,所以它看起来像这样

Q1--------Q3------------------Q7----- 

I,E,仅释放事件齐Ti时把它们结合起来发行了。

有没有简单的方法来实现这个使用RX原语?

+0

查看'.combineLatest'运算符。 –

+1

我看过.combineLatest,但不会暂停'Q'流。例如,'Q3'将在'T2'发射,当它应该等待'T3'时。 –

+0

这个想法是,你会'过滤'不需要的对和'地图'回适当的Q值。 –

回答

2

如果你们的关系是单向的唯一(即T事件匹配Q一个之前发生),你可以用(JS语法待定)实现这一点:

tElts.selectMany(i -> qElts.takeWhile(n -> n<=i).where(n -> n==i)) 

内流将返回一个元素T3的流Q3,T2的空流。

0

zip运营商同步多个流。

+0

我认为压缩将不起作用,因为T3将与Q7配对。 –

1

我不确定您是否在寻找JavaScript解决方案或System.Reactive命名空间中的某个东西。我有这个.NET解决方案。该解决方案假定Q总是比T更快地生成,即,对于所有n,Q 将不会在T n之后生成

// Generate 8 T's, 1 per second. 
IObservable<int> tSource = 
    Observable 
    .Interval(TimeSpan.FromSeconds(1)) 
    .Select(x => (int)(x + 1)) 
    .Take(8); 

// Generate 4 Q's immediately. 
IObservable<int> qSource = 
    (new int[] { 1, 3, 7, 10 }) 
    .ToObservable(); 

var result = 
    qSource 
    .SelectMany(x => 
     tSource 
     .Where(y => x == y) 
     .Take(1)); 

有趣的是,这看起来像Gluck解决方案的双重作用。