2015-09-25 89 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解決方案的雙重作用。