我有许多反应式命令以及一些具有某些信息的可观察对象,并且我正在尝试执行以下操作:

_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

10-08 13:53