在 C# 中使用 RX 自动保存

Autosave with RX in C#

我想实现自动保存功能。我有两个 Observable:

现在我想将它们合并到第三个流中 writeBack。此流有一个订阅者,它将当前文本写入数据库。

How do i create the writeBack stream, so that it fullfills the following properties?

我想确保写回未保存的更改。如果出现以下情况,我不想保存文本:

这应该可以做到。首先我们确定我们可能想要保存的时间:

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);

并使用枚举 class

enum EventType
{
    SaveTrigger,
    Edit
}