如何在 ReactiveUI 中使用 WhenAny(...) 合并多个可观察值?

2024-01-08

我有一个问题,它是本网站上提出的以下问题的延伸。

当返回类型不重要时,是否有更优雅的方法来合并可观察量? https://stackoverflow.com/questions/8010372/is-there-a-more-elegant-way-to-merge-observables-when-return-type-is-unimportant/21762027#21762027

我有一个IObservable<Unit>(可以说X),反应式集合(Y)和属性(Z)。返回类型并不重要。我只想在其中任何一个发生变化时订阅。

我知道如何观察所有 3 个并且Subscribe using Observable.Merge如下。

Observable.Merge(X, Y.Changed, ObservableForProperty(Z).Select(_ => Unit.Default)).Subscribe(..)

它有效。

但是,当我尝试使用WhenAny(...,....,....).Subscribe(),当我的X变化。使用执行上述操作的语法是什么WhenAny(...)而不是Observable.Merge(..)??

我更喜欢使用WhenAny(....)因为我正在使用ReactiveUI在其他地方。

例子: 假设我有一个派生类ReactiveObject具有以下属性。

public class AnotherVM : ReactiveObject
{
    public bool IsTrue
    {
        get { return this.isTrue; }
        set { this.RaiseAndSetIfChanged(x => x.isTrue, ref this.isTrue, value); }
    }

    public IObservable<Unit> Data
    {
        get { return this.data; }
    }

    public ReactiveCollection MyCol
    {
       get { return Mycol; }
    }    
}

public class MyVM : ReactiveObject
{
    MyVM
    {
       // do WhenAny or Observable.Merge here....
    }
}

我想观察上述属性AnotherVM类使用Observable.Merge(..) or WhenAny(...) in MyVM班级。我发现当我订阅上述内容时并不总是收到通知MyVM using WhenAny(...) or Merge(...)当这 3 个属性中的任何一个发生变化时。


WhenAny不是用于跨任意可观察值集进行监视,而是用于监视 ReactiveUI 支持的对象的属性(例如 ReactiveObject 或反应式集合)。

对于组合可观察流中的变化的一般情况,Observable.Merge是正确的方法。

EDIT

我注意到您已将 Data 和 MyCol 属性声明为只读。如果您使用Merge像这样:

Observerable.Merge(this.WhenAnyValue(o=>o.IsTrue, v=>Unit.Default),
                   this.Data,
                   this.MyCol.CollectionChanged.Select(v=>Unit.Default))

...那么您必须小心不要更改支持字段。如果你这样做,那么你会丢失事件 - 也许这就是正在发生的事情?

在这种情况下,您需要将这些属性连接到RaiseAndSetIfChanged并使用Switch跟踪 - 例如如果this.data可以更改然后您需要(我在这里使用 ReactiveUI 5 + .NET 4.5,以防 RaiseAndSetIfChanged 语法看起来很奇怪):

public IObservable<Unit> Data
{
    get { return this.data; }
    private set { this.RaiseAndSetIfChanged(ref data, value); }
}

你的合并将是这样的:

Observerable.Merge(this.WhenAnyValue(o=>o.IsTrue, v=>Unit.Default),
                   this.WhenAnyObservable(x => x.Data),
                   this.MyCol.CollectionChanged.Select(v=>Unit.Default))

WhenAnyObservable 在概念上等价于:

WhenAny(x => x.Data, vm => vm.Value).Switch()

使用 Switch 翻转到最新值Data当它改变时。不要忘记使用设置器来更改数据值!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ReactiveUI 中使用 WhenAny(...) 合并多个可观察值? 的相关文章

  • 创建一个包含比原始元素更多元素的 ReactiveUI 派生集合

    是否可以创建一个 ReactiveUI 派生集合 其中包含比原始集合更多的元素 我已经看到有一种方法可以过滤集合并选择单个属性 但我正在寻找相当于可枚举的 SelectMany 操作 为了说明这一点 想象一下尝试获取代表每个陷入交通拥堵的乘
  • 如何使用带有响应式 UI 的 Xamarin Android 将数据绑定到自定义 ListView

    我正在使用带有响应式 UI 的 Xamarin Android 而不是使用 Xamarin Forms 我有一个自定义 ListView 我已将其布局定义为 xaml 我不知道如何将此控件绑定到 ViewModel 中的 observabl
  • 反应式扩展的用途是什么

    一个 MVC 3 网站 其中一些部分使用 Silverlight 5 这种情况下可以使用Rx吗 如果是这样 如何以及由哪些组成部分 申请可以受益 The Rx 的预发布文档 http msdn microsoft com en us lib
  • 我正在尝试通过外部 api 从 json 数据获取键值对,并使用 Angular 和 TypeScript 显示它。我怎样才能实现这个目标?

    我想从我的 api 获取结果对象中的每个键值对以显示在我的前端上 即 类别 类型 难度 问题正确答案 我已正确设置服务和组件 我需要做的就是获取 json 并显示每一对 该方法名称称为 fetchQuestions 如下所示 我只需简单地以
  • JavaFX SimpleObjectProperty 与 SimpleTProperty

    使用有什么区别 简单字符串属性 vs SimpleObjectProperty or 简单整数属性 vs SimpleObjectProperty 除了返回包装器而不是原始类型之外 无论如何它都可以自动转换 API 为特定类型添加了附加功能
  • 为什么我应该使用 HttpClient 而不是 fetch?

    Angular 2 介绍HttpClient它发出一个 HTTP 请求并将它们发送到一个 RxJS observable 中 我的问题是为什么我会选择使用HttpClient s API https angular io guide htt
  • 基于内容的 RxJava Observable 缓冲区

    我使用 vertX 和 RxJava 启动了一个项目 但遇到了一个问题 但没有找到解决方案 我有一个 Observable 它为传入通信发出 WebSocketFrame 每个 WebSocketFrame 由有效负载 ByteBuffer
  • Angular2 - 多个依赖的顺序 http api 调用

    我正在构建一个 Angular2 应用程序 其中一个组件需要进行多个 API 调用 这些调用依赖于之前的调用 我目前有一项服务可以调用 API 来获取电视节目列表 对于每个节目 我需要多次调用不同的 API 来逐步检查该结构 以确定该节目是
  • Angular2 可观察定时器条件

    我有一个计时器 initiateTimer if this timerSub this destroyTimer let timer TimerObservable create 0 1000 this timerSub timer sub
  • Angular 5 订阅和取消订阅 Observable

    我必须从两个订阅获取数据 但我总是得到第一个订阅的数据 我有一个数据共享服务 import Injectable from angular core import BehaviorSubject from rxjs BehaviorSubj
  • Kendo UI - observable、ObservableObject 和 Model 之间的区别

    observable ObservableObject 和 Model 之间有什么区别 谢谢 Model继承自ObservableObject 而ObservableObject又继承自Observable 可观察的 http docs k
  • Angular 4 中的多个顺序 API 调用

    我有一系列图像对象 console info gallery galleryArray 该数组的长度可以不同 我必须对该数组的每个项目发出 POST 请求 只有在前一个请求完成后 才能执行下一个请求 所以我尝试发出一系列可观察的请求 如下所
  • 从后台线程更新可观察列表的正确方法

    我正在尝试遵循 MVC 进行测试项目 因此我的模型应该完全独立于我的观点 但是我不确定应该如何更新在后台线程中更新的可观察列表 正在给出有关上传的字符串 文件 以便消息显示在 UI 上的 ListView 中 我正在使用 JavaFX 并尝
  • Angular2 - *ngIf 和异步可观察量

    我在将 ngIf 与可观察变量一起使用时遇到问题 问题是 当我隐藏元素时 ngIf 然后再次显示 值将不会加载 因此 div someObservable async div 基本上当 showDiv 设置为true首先 加载了 someO
  • RXJS Observable - 如何从 Observable 的构造函数外部调用 next

    我正在构建一个公开 Observable 的服务 在此服务中 我接收外部函数调用 这些函数调用应该触发 Observable 上的下一个调用 以便各个消费者获得订阅事件 在观察者构造函数期间 我可以调用 next 并且一切正常 但是如何在构
  • 反应式扩展吞掉线程池线程上调用的 OnNext() 的异常?

    我在 Net 4 5 中使用 Rx 2 当以下代码运行时 它只是静默退出 而不执行 OnCompleted 委托或显示任何错误 如果我使用Scheduler CurrentThread in ToObservable 它至少会抛出错误并终止
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 获取路由查询参数

    我正在尝试从 rc1 迁移到 rc4 但在获取查询字符串参数时遇到问题 ActivatedRoute 对象始终为空 英雄组件 ts import Component OnInit from angular core import Contr
  • Rxjs 可观察等待直到满足某些条件

    我有以下重试逻辑来重试操作 对于单个请求来说它工作得很好 对于多个正在进行的请求 我想在重试之前等待现有的重试逻辑完成 handleError errors Observable
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上

随机推荐

  • Android AsyncTask 与进度对话框取消

    在我的android应用程序中 我使用带有进度对话框的AsyncTask 请等待登录 来使用我的网页 异步任务内的Web服务功能 登录用户 当用户单击设备上的 后退 按钮时 我想关闭进度对话框并取消 AsynTask 我找不到用于中断 As
  • Swift - 从 JSON 响应创建数据模型

    我正在学习 Swift 语言 很高兴听到其他人输入的内容之一是 如何处理来自 JSON 响应的模型 例如 I have User swift model class User NSObject var user token String v
  • 自动分配spring的bean名称以防止名称冲突?

    在Spring应用程序中 如果两个程序员开发两个包 将 Repository注释为相同的类名 Spring将抛出 IllegalStateException 注解指定的bean名称 mybean 代表 bean 类 foobar packa
  • 如何从 URL 方案中获取参数。

    我在我的 iPhone 应用程序中使用 URL 方案 从一个页面将用户切换到 safari 然后从网页单击一个按钮 我将恢复到应用程序 此时 一些参数是由网页传递的 例如 myapp parameter 1 如何从我的应用程序中找到此参数
  • jQuery.ajax -always() 并不总是运行

    我正在使用 jQuery ajax 进行 REST 调用并检索一些 JSON 它按预期工作 但是 当我强制出现错误条件 例如无效 URL 时 always 方法不会触发 如果我设置 crossDomain false 或 dataType
  • Linux 文件 IO - 多线程性能 - 写入不同的文件

    我目前正在开发一个音频录制应用程序 该应用程序从网络获取最多 8 个音频流并将数据保存到磁盘 简化的 现在 每个流都由一个线程处理 gt 同一线程还在磁盘上执行保存工作 这意味着我有 8 个不同的线程在同一磁盘上执行写入操作 每个线程写入不
  • 有没有办法区分应用程序是在登录时由启动服务启动还是由用户启动? [复制]

    这个问题在这里已经有答案了 Cocoa 应用程序可以将自己添加到LSSharedFileList的登录项目列表 这将允许应用程序在用户登录时启动 但是 有没有办法判断用户是启动应用程序还是应用程序在登录时自动启动 这很有用 因为在一种情况下
  • MacOS Mojave 中未找到 ntpdate 命令

    我有一个 Bash 脚本可以更新我的 mac 时间 但自从 Mojave 更新后找不到该命令 ntpdate u time apple com return ntpdate command not found 我哪里出错了 这是重复的 请检
  • 在python中将文件从latin1转换为utf-8的最快方法

    我需要在 python 中将文件从 latin1 转换为 utf 8 的最快方法 文件很大 2G 我正在移动数据库数据 到目前为止我已经 import codecs infile codecs open tmpfile r encoding
  • ED A0 80 ED B0 80 是有效的 UTF-8 字节序列吗?

    java nio charset Charset forName utf8 decode http docs oracle com javase 7 docs api java nio charset Charset html decode
  • Java:方法名称/签名解析是否静态完成(编译时)?

    今天我遇到了一个有趣的问题 我认为这在 Java 中是不可能的 我针对 jgroups 2 6 版本编译了 java 代码 但在运行时使用了 2 12 版本 tomcat Web 应用程序部署 我收到以下错误 org jgroups Mes
  • 使 HTA 文件以管理员身份运行(提升)

    在 wsf vbs 和 js 文件中 您可以轻松地找出它们是否运行提升 如果没有 您可以轻松地制作它们 我为此编写的代码是这样的 EnsureElevatedPrivileges WScript Echo Running elevated
  • 反序列化以在运行时键入

    我正在尝试使用TypeAdapterFactory序列化和反序列化一些客户对象 我想在运行时将所有对象序列化为特定类型 所以给定一个String classpath and a JsonObject object我想将对象反序列化为实例Cl
  • C# - 方法的类型签名与 PInvoke 不兼容

    我正在尝试在 C 2010 中使用 VC 2003 dll 当我从 C 调用 dll 的方法时出现此错误 方法的类型签名与 PInvoke 不兼容 I am returning the structure from VC Code stru
  • longjmp 是如何工作的?

    我需要了解 longjmp 函数是如何工作的 我知道它的作用 但我需要知道它是如何做到的 我试图在 gdb 中禁用代码 但我无法理解一些步骤 代码是 0xb7ead420
  • 设置 boost socket.connect 的超时

    我在用boost asio connect on a tcp socket 当一切顺利时 connect立即返回 但在网络较差的情况下 connect日志等待 15 秒后超时 我不能等那么久 所以想减少超时 不幸的是 到目前为止我还没有找到
  • 将 Shell 脚本转换为 *.app 文件

    使用 Automator app 和 Platypus app 我已经能够捆绑我创建的一个简单的 shell 脚本 以在 MacBook Pro 上重新启动 wi fi 生成的两个应用程序都可以正常运行 但有一个我想纠正的明显问题 应用程序
  • DBIx::Class 包装/重载列访问器

    使用 DBIx Class 我试图在更新或检索列的数据时对其进行操作 例如 在它进入数据库之前我想对其进行加密 并且每当它被访问时我想对其进行解密 我正在遵循这个例子DBIx 类 手册 食谱 https metacpan org modul
  • C++:当在函数内创建新对象并将其作为结果返回时,我必须使用 new 运算符来创建对象吗?

    我有两个虚拟问题让我困惑了一段时间 我确实在网上做了一些搜索并阅读了很多 C 教程 但是我找不到具体的答案 假设我们有一个名为 Node 的类 它是单链表的构建块 class Node int data Node next 事实1 局部变量
  • 如何在 ReactiveUI 中使用 WhenAny(...) 合并多个可观察值?

    我有一个问题 它是本网站上提出的以下问题的延伸 当返回类型不重要时 是否有更优雅的方法来合并可观察量 https stackoverflow com questions 8010372 is there a more elegant way