cod*_*ter 2 reactive-programming system.reactive
我知道有一种简单的方法可以做到这一点 - 但它今晚打败了我......
我想知道两个事件是否在300毫秒之内发生,就像双击一样.
在300毫秒内点击两次左击鼠标 - 我知道这就是反应框架的构建 - 但是如果我能找到一个包含所有扩展操作系统的简单示例的好文档 - Throttle,BufferWithCount,BufferWithTime - 所有这些都不是'为我做这件事......
该TimeInterval方法将为您提供值之间的时间.
public static IObservable<Unit> DoubleClicks<TSource>(
this IObservable<TSource> source, TimeSpan doubleClickSpeed, IScheduler scheduler)
{
return source
.TimeInterval(scheduler)
.Skip(1)
.Where(interval => interval.Interval <= doubleClickSpeed)
.RemoveTimeInterval();
}
Run Code Online (Sandbox Code Playgroud)
如果你想确保三次点击不会触发值,你可以只使用Repeat一个热的可观察量(我已经在FastSubject这里使用了,因为点击将全部来自一个线程,因此不需要正常的沉重科目):
public static IObservable<TSource> DoubleClicks<TSource>(
this IObservable<TSource> source, TimeSpan doubleClickSpeed, IScheduler scheduler)
{
return source.Multicast<TSource, TSource, TSource>(
() => new FastSubject<TSource>(), // events won't be multithreaded
values =>
{
return values
.TimeInterval(scheduler)
.Skip(1)
.Where(interval => interval.Interval <= doubleClickSpeed)
.RemoveTimeInterval()
.Take(1)
.Repeat();
});
}
Run Code Online (Sandbox Code Playgroud)