我有一个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运算符不仅“记住”最新的有效负载,还可以“记住”最新的有效负载?
您可以使用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
时。)>
注意:我可能倒向了current
和local
。已经很晚了,您的示例很好地说明了为什么应该避免使用全局状态...推理起来非常棘手。