限制流
假設你需要實現自動搜尋框,但搜尋操作有點昂貴,例如傳送 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);
// notify that the search text has been changed
o.OnNext(builder.ToString());
// pause between each character to simulate actual typing
Thread.Sleep(125);
// spent some time to think about the next word to type
if (c == ' ')
Thread.Sleep(1000);
}
o.OnCompleted();
return () => { /* nothing to dispose here */ };
});
}
現在,我們不希望每次使用者按下鍵時都執行搜尋。相反,只要使用者停止輸入的時間超過半秒,它就會完成:
TypingSearchText()
// print the changes
.Do(x => Console.WriteLine("Typing: " + x))
// ignore changes that happens within 500ms of each other
.Throttle(TimeSpan.FromMilliseconds(500))
// some costly operation
.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