假设您需要实现一个自动搜索框,但是搜索操作的成本较高,例如发送Web请求或建立数据库。您可能想限制搜索的数量。
例如,用户在搜索框中输入“ C#Reactive Extensions”:
IObservable<string> TypingSearchText() { return Observable.Create<string>(o => { const string SearchText = "C# Reactive Extensions"; var builder = new StringBuilder(); foreach (var c in SearchText) { builder.Append(c); // 通知搜索文本已更改 o.OnNext(builder.ToString()); // 在每个字符之间停顿以模拟实际打字 Thread.Sleep(125); // 花了一些时间思考下一个要输入的单词 if (c == ' ') Thread.Sleep(1000); } o.OnCompleted(); return () => { /* nothing to dispose here */ }; }); }
现在,我们不想在用户每次按键时都执行搜索。取而代之的是,只要用户停止输入超过半秒,它就会完成:
TypingSearchText() // 打印更改 .Do(x => Console.WriteLine("Typing: " + x)) // 忽略彼此之间500毫秒内发生的更改 .Throttle(TimeSpan.FromMilliseconds(500)) // 一些昂贵的操作 .Subscribe(x => Console.WriteLine("Searching: " + x));
输出:
Typing: C Typing: C# Typing: C# Searching: C# Typing: C# R Typing: C# Re ... Typing: C# Reactive Typing: C# Reactive Searching: C# Reactive Typing: C# Reactive E Typing: C# Reactive Ex ... Typing: C# Reactive Extension Typing: C# Reactive Extensions Searching: C# Reactive Extensions