簡體   English   中英

在 C# 中使用 RX 自動保存

[英]Autosave with RX in C#

我想實現一個自動保存功能。 我有兩個 Observable:

  • IObservable<Unit> changes :每次用戶編輯文本時發出一個項目
  • IObservable<Unit> saves :每次按下保存按鈕時發出保存事件

現在我想將它們組合成第三個流writeBack 該流有一個訂閱者,它將當前文本寫入數據庫。

我如何創建 writeBack 流,以便它滿足以下屬性?

  • 未保存的更改將被寫回,如果 3 秒內沒有發生任何更改(如油門
  • 保存事件立即寫回最后一次未保存的更改

我想確保寫回未保存的更改。 如果出現以下情況,我不想保存文本:

  • 有一個保存事件,但沒有變化
  • 連續兩個保存事件,但兩者之間沒有變化
  • 更改與其自動保存之間存在保存事件

這應該這樣做。 首先,我們確定我們可能想要保存的時間:

var saveTriggers = changes.Throttle(TimeSpan.FromSeconds(3))
    .Merge(saves);

接下來,我們將它們過濾掉以確保它們符合您的邏輯:每次保存之間至少進行一次編輯,並且保存不能先進行。 SkipWhile只是為了確保忽略更改之前的保存。 Scan計算每次保存之間的更改次數。 我們只關心該數字何時變為 0(表示觸發了保存)。 並且DistinctUntilChanged過濾掉連續的保存。

var actualSaves = saveTriggers.Select(_ => EventType.SaveTrigger)
    .Merge(changes.Select(_ => EventType.Edit))
    .SkipWhile(et => et == EventType.SaveTrigger)
    .Scan(0, (editCount, eventType) => eventType == EventType.SaveTrigger ? 0 : editCount + 1)
    .DistinctUntilChanged()
    .Where(count => count == 0)
    .Select(_ => Unit.Default);

並使用枚舉類

enum EventType
{
    SaveTrigger,
    Edit
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM