繁体   English   中英

RX如何将命令与另一个可观察到的结合

[英]Rx how to combine command with another observable

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

_navigate = ReactiveCommand.Create(CanNavigate);
_navigate.CombineLatest(navigationTarget, (_, tgt) => tgt)
    .Subscribe(tgt => Navigation.NavigateTo(tgt));

我尝试了几种不同的方法:

  1. SelectMany
  2. Zip

我要么以:

  1. 订阅在第一次后停止调用(如果我使用Zip)
  2. 即使命令执行一次后仍未执行,Subscribe也会被调用

本质上我想要:

一个可观察的对象,每次(且 )在执行命令时触发,并拉入第二个可观察的对象的最新值。

无法完全了解如何最好地实现这一目标...

如果您能够使用预发行版本,则最新的(2.3.0-beta2)具有方法WithLatestFrom可以完全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());
}

资源

我们使用Join实现此行为。

这个想法是在一个时刻,你有一个windownavigtion target并没有窗口_navigate命令。 当出现命令时,它将从另一个序列的当前打开的窗口中获取值。 当新的navigationTarget到达时, navigationTarget值的窗口关闭。

_navigate.Join(
    navigationTarget,
    _ => Observable.Empty<Unit>(),
    _ => navigationTarget,
    (_, tgt) => tgt).Subscribe(tgt => Navigation.NavigateTo(tgt));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM