繁体   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