当第二个 observable 发出时获取第一个 observable 的最新值
Get the latest value of first observable when second observable emits
我的视图模型中有两个 Observable,一个是 UI 更改值的 Observable,另一个表示命令失败时引发的异常。
我想创建一个可观察对象,它在引发异常时从第一个可观察对象发出值。简而言之,我想获得以下结果
大理石图
Value (Observable 1) -- 1 --- 2 -------- 3 ------ 4 ---------------- 5 -----------
Exception (Observable 2) ----------- e ------------------------- e ------------ e --
ExpectedResult ----------- 2 ------------------------- 4 ------------ 5 --
您正在寻找 Sample
。
Value
.Sample(Exception)
.Subscribe(...);
每次 Exception
发出信号时,这将从 Value
获取最新值。
无法真正改善 'Sample' 响应,但如果您想使用某些 older/original/core 功能构建它,基本上,您只需要结合 'CombineLatest' ,加上异常流上的 DistinctUntilChanged()。
var values = new Subject<int>();
var exception = new Subject<Exception>();
values.CombineLatest(exception, Tuple.Create)
.DistinctUntilChanged(t => t.Item2)
.Select(t => t.Item1)
.Dump();
values.OnNext(1);
values.OnNext(2);
exception.OnNext(new Exception());
values.OnNext(3);
values.OnNext(4);
exception.OnNext(new Exception());
输出:
IObservable
2个
4
确保异常是热的或已发布。
Value.SelectMany(v => Exception
.Take(1).Select(e => v))
.Switch();
当两个异常之间没有值时,这将使您获得最后一个值。
我的视图模型中有两个 Observable,一个是 UI 更改值的 Observable,另一个表示命令失败时引发的异常。
我想创建一个可观察对象,它在引发异常时从第一个可观察对象发出值。简而言之,我想获得以下结果
大理石图
Value (Observable 1) -- 1 --- 2 -------- 3 ------ 4 ---------------- 5 -----------
Exception (Observable 2) ----------- e ------------------------- e ------------ e --
ExpectedResult ----------- 2 ------------------------- 4 ------------ 5 --
您正在寻找 Sample
。
Value
.Sample(Exception)
.Subscribe(...);
每次 Exception
发出信号时,这将从 Value
获取最新值。
无法真正改善 'Sample' 响应,但如果您想使用某些 older/original/core 功能构建它,基本上,您只需要结合 'CombineLatest' ,加上异常流上的 DistinctUntilChanged()。
var values = new Subject<int>();
var exception = new Subject<Exception>();
values.CombineLatest(exception, Tuple.Create)
.DistinctUntilChanged(t => t.Item2)
.Select(t => t.Item1)
.Dump();
values.OnNext(1);
values.OnNext(2);
exception.OnNext(new Exception());
values.OnNext(3);
values.OnNext(4);
exception.OnNext(new Exception());
输出:
IObservable 2个 4
确保异常是热的或已发布。
Value.SelectMany(v => Exception
.Take(1).Select(e => v))
.Switch();
当两个异常之间没有值时,这将使您获得最后一个值。