1

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

  • IObservable<Unit> changes:每次用户编辑文本时发出一个项目
  • IObservable<Unit> saves: 每次按下保存按钮时发出一个保存事件

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

如何创建 writeBack 流,以使其满足以下属性?

  • 如果 3 秒内没有发生任何更改(如油门) ,则未保存的更改将被写回
  • 保存事件立即写回最后未保存的更改

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

  • 有一个保存事件,但没有变化
  • 连续两次保存事件,但两者之间没有变化
  • 在更改与其自动保存之间有一个保存事件
4

1 回答 1

1

这应该这样做。首先,我们确定我们可能想要节省的时间:

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
}
于 2017-01-23T04:47:30.790 回答