如何在可观察到的反应性扩展中存储先前的有效载荷?

问题描述 投票:0回答:1

我有一个IObservable boolObservable,发布者的行为就像switch。还有具有某些值的变量currentItem和包含预定义的不可变值的defaultItem。每当发布“ true”时,都应记住currentItem的值,并将currentItem设置为defaultItem。发布“ false”时,currentItem的值应更改为前一个。实现此目的的最简单方法是使用局部变量。

IObservable<bool> boolObservable;
string currentItem;
string defaultItem;

string local = null;
boolObservable.Subscribe(x =>
  {
    if (x) {
      local = currentItem;
      currentItem = defaultItem;
    }
    else
      currentItem = local;
  });

问题开始,当我不得不重复几次并分别命名用于存储的局部变量时。有没有一种方法可以使用Rx运算符不仅“记住”最新的有效负载,还可以“记住”最新的有效负载?

c# system.reactive
1个回答
0
投票

您可以使用Scan通过可观察的序列来穿线状态。例如:

public static IObservable<string> EitherItemOrDefault(IObservable<bool> switchSource, IObservable<string> itemSource, string defaultValue)
{
    return switchSource
        .WithLatestFrom(itemSource.StartWith(string.Empty), (switchValue, itemValue) => (Switch: switchValue, Item: itemValue))
        .Scan(
            (Current: string.Empty, Local: string.Empty),
            (seed, tuple) => tuple.Switch 
                            ? (Current: defaultValue, Local: tuple.Item) 
                            : (Current: seed.Local, Local: seed.Local))
        .Select(tuple => tuple.Current);
}

这将IObservable<bool>作为您的“开关”,将IObservable<string>作为项目(在您的示例中为currentItem),并返回一个IObservable<string>,当defaultValue发出switchSource时将包含False ]和最后一个currentItem值(当switchSource发出True时。)>

注意:我可能倒向了currentlocal。已经很晚了,您的示例很好地说明了为什么应该避免使用全局状态...推理起来非常棘手。

© www.soinside.com 2019 - 2024. All rights reserved.