Reactive Framework/DoubleClick

cod*_*ter 2 reactive-programming system.reactive

我知道有一种简单的方法可以做到这一点 - 但它今晚打败了我......

我想知道两个事件是否在300毫秒之内发生,就像双击一样.

在300毫秒内点击两次左击鼠标 - 我知道这就是反应框架的构建 - 但是如果我能找到一个包含所有扩展操作系统的简单示例的好文档 - Throttle,BufferWithCount,BufferWithTime - 所有这些都不是'为我做这件事......

Ric*_*lay 9

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)