在 C# 中使用 RX 自动保存
Autosave with RX in C#
我想实现自动保存功能。我有两个 Observable:
IObservable<Unit> changes
:每次用户编辑文本时发出一个项目
IObservable<Unit> saves
:每次按下保存按钮时都会发出一个保存事件
现在我想将它们合并到第三个流中 writeBack。此流有一个订阅者,它将当前文本写入数据库。
How do i create the writeBack stream, so that it fullfills the following properties?
- 如果 3 秒内没有发生任何更改(例如 throttle)
,则会写回未保存的更改
- 保存事件立即写回最后未保存的更改
我想确保仅写回未保存的更改。如果出现以下情况,我不想保存文本:
- 有保存事件,但没有变化
- 连续两次保存事件,但两者之间没有变化
- 更改和自动保存之间有一个保存事件
这应该可以做到。首先我们确定我们可能想要保存的时间:
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
}
我想实现自动保存功能。我有两个 Observable:
IObservable<Unit> changes
:每次用户编辑文本时发出一个项目IObservable<Unit> saves
:每次按下保存按钮时都会发出一个保存事件
现在我想将它们合并到第三个流中 writeBack。此流有一个订阅者,它将当前文本写入数据库。
How do i create the writeBack stream, so that it fullfills the following properties?
- 如果 3 秒内没有发生任何更改(例如 throttle) ,则会写回未保存的更改
- 保存事件立即写回最后未保存的更改
我想确保仅写回未保存的更改。如果出现以下情况,我不想保存文本:
- 有保存事件,但没有变化
- 连续两次保存事件,但两者之间没有变化
- 更改和自动保存之间有一个保存事件
这应该可以做到。首先我们确定我们可能想要保存的时间:
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
}