我有许多反应式命令以及一些具有某些信息的可观察对象,并且我正在尝试执行以下操作:
_navigate = ReactiveCommand.Create(CanNavigate);
_navigate.CombineLatest(navigationTarget, (_, tgt) => tgt)
.Subscribe(tgt => Navigation.NavigateTo(tgt));
我尝试了几种不同的方法:
SelectMany
Zip
我要么以:
订阅在第一次后停止调用(如果我使用Zip)
即使命令执行一次后仍未执行,Subscribe也会被调用
本质上我想要:
每次(且仅)在执行命令时触发一次可观察对象,同时提取第二个可观察对象的最新值。
无法完全了解如何最好地实现这一目标...
最佳答案
如果您能够使用预发行版本,则最新版本(2.3.0-beta2)的方法WithLatestFrom
正是这样做的。
_navigate.WithLatestFrom(navigationTarget, (_, tgt) => tgt)
.Subscribe(tgt => Navigation.NavigateTo(tgt));
如果没有,您可以通过以下方式创建自己的:
public static IObservable<TResult> WithLatestFrom<TLeft, TRight, TResult>(
this IObservable<TLeft> source,
IObservable<TRight> other,
Func<TLeft, TRight, TResult> resultSelector)
{
return source.Publish(os =>
other.Select(a => os
.Select(b => resultSelector(b,a)))
.Switch());
}
Source