Rx Scala - 如何在发射之间实现最短时间

时间:2017-10-17 19:46:24

标签: scala observable

有人可以帮我提出一个功能,我可以应用于一个可以防止发射很快发生的观察。

val later = Subject[Int]()
val combined = Observable.from(List(1,2,3,4,5,6,7,8)) ++ later
combined.delayMinTime(1 second).doOnEach(...)

通常这会发出1-8,然后在'之后'接收onNext。但我想要的是发出1-8,每秒发一次然后随时收到一些东西,以及如果收到任何东西太快它会延迟每个条目。 所以在Rxmarbles中 - 它看起来像这样

1 2 3 4               5 6          7 
▼
1   2   3   4         5    6       7

顺便说一句,如果还有一个更好的函数名称,那么...

1 个答案:

答案 0 :(得分:0)

我为此感到抱歉是C#,但这已经越来越近了:

var query = source.Publish(xs => xs.Window(() =>
{
    var n = DateTimeOffset.Now;
    return xs.Select((x, i) => Observable.Timer(TimeSpan.FromSeconds(System.Math.Max(1.0 + (double)i - DateTimeOffset.Now.Subtract(n).TotalSeconds, 1.0)))).Switch();
})).Select(xs => xs.Zip(Observable.Interval(TimeSpan.FromSeconds(1.0)), (x, _) => x)).Merge();

它仍然允许一些差距小于1.0秒的值,但它可能是一个很好的开始,可以帮助你解决问题。

相关问题