仅当其中一个流发生更改时,combineLatest 才会发出

2024-04-09

我有一个具有频繁值的流和一个具有较慢值的流。我想将它们组合起来,但仅当较慢的发出时才发出一个值。所以combineLatest不起作用。 就像这样:

a1
a2
b1
(a2,b1)
a3
a4
a5
b2
(a5,b2)

目前我正在这样做,有没有更干净的方法?

withLatest[A,B](fast : Observable[A], slow : Observable[B]): Observable[(A,B)] =
  Observable({ o =>
    var last : A
    fast.subscribe({a => last = a})
    slow.subscribe({b => o.onNext((last,b))})
  })

edit:该运算符现在处于 Rx 中,称为与最新来自 https://github.com/ReactiveX/RxJava/pull/2760.


您正在寻找的是一个我称之为“combinePrev”的组合器,它在 API 中不存在,但在许多情况下却非常必要。sample运算符很接近,但它不会合并两个流。我还错过了 RxJS 中的“combinePrev” https://github.com/Reactive-Extensions/RxJS/issues/335。事实证明,“combinePrev”(“withLatest”)的实现很简单,只依赖于 map 和 switch:

withLatest[A,B](fast : Observable[A], slow : Observable[B]): Observable[(A,B)] = {
  val hotSlow = slow.publish.refCount
  fast.map({a => hotSlow.map({b => (a,b)})}).switch
}

这里有一个jsfiddle http://jsfiddle.net/staltz/2orcypoz/3/在 RxJS 中实现的相同运算符的示例。

虽然运算符不在 Rx 中,但您可以使用隐式类,这样您就可以使用slow.withLatest(fast):

implicit class RXwithLatest[B](slow: Observable[B]) {
  def withLatest[A](fast : Observable[A]) : Observable[(A,B)] = /* see above */
}

Note: slow必须是hot. If slow是一个冷的 Observable,withLatest不起作用。

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

仅当其中一个流发生更改时,combineLatest 才会发出 的相关文章

随机推荐

  • 通过引用传递数组与传递指针的函数参数绑定规则

    为了防止任何混淆 我非常了解数组和指针之间的区别 衰减到指针的概念以及通过传递数组的概念参考在C 等中 我的问题是具体来说关于编译器从一组函数中选择一个函数所使用的规则overload候选者 当一个重载采用数组引用 而另一个重载采用指针时
  • 同一数据库中的实体框架核心多个 DbContext 迁移

    在 Entity Framework 6 中 您可以为 DbContext 指定 ContextKey 以便在将一个数据库用于多个 DbContext 时 迁移表知道哪个迁移针对哪个 DbContext 在过去的几个小时里 我一直在尝试弄清
  • 适用于 Linux 的 NUMA 感知命名共享内存

    Windows API 提供了 CreateFileMappingNuma 函数 http msdn microsoft com en us library windows desktop aa366539 v vs 85 aspx htt
  • Ruby win32ole - 如何传递 VARIANT 参数?

    我正在尝试使用 Ruby 自动化 Windows 任务计划程序 我在 Windows Vista 下使用 Ruby 1 8 TaskFolder 对象的 RegisterTaskDefintion 方法采用两个 VARIANT 参数作为用户
  • Git 推送到错误的分支

    使用 git 进行一些 提交 和几次 推送 之后 我意识到我使用了错误的分支 现在我必须以某种方式删除我的更改wrong branch并提交并推送更改right branch 最好的 而且简单的 方法是什么 切换到该分支 检查git log
  • “LazyCorpusLoader”对象不可迭代

    以下示例创建一个字谜词典 然而 它抛出一个TypeError LazyCorpusLoader object is not an iterator import nltk from nltk corpus import words anag
  • 使用 jQuery 将单个事件处理程序绑定到多个事件

    我有以下 div 具有不同的 onblur onmousedown onmouseup 和 onfocus 功能 我想最小化代码 并且在 div 内只有一个函数调用来处理所有函数状态 我想用 jquery 来做到这一点 所以换句话说 我想创
  • 用 Python 表示网络

    我有一个顶点 例如dic a 0 b 1 c 2 d 3 e 4 f 5 n 6 m 7 g 8 我有两列如下代表顶点之间的关系 a a b d e f c f n f m g 我想通过一条边将第一列中的每个顶点与第二列中的相应顶点关联起来
  • R中的距离计算优化

    我想知道是否有任何方法可以优化下面的距离计算过程 我在下面留下了一个小例子 但是我正在处理一个超过 6000 行的电子表格 计算变量 d 需要相当长的时间 可以通过某种方式调整它以获得相同的结果 但以优化的方式 library rdist
  • 如何在 C# 中将对象类型传递给类型参数

    我有一个具有类型参数的函数 public static object SetValuesToObject Type tClass DataRow dr return object 我不知道如何传递一个类作为该函数的参数 在这里我想传递参数类
  • Rails 5 中的 Webpacker 需要很长时间才能编译那么多文件。我怎样才能看到它在做什么?

    Webpacker Compiling 编译我对 javascript 文件的任何更改都需要几秒钟 6 2 秒 这确实减慢了我的 JS 开发速度 有没有办法查看 Rails 中的 Webpacker 正在做什么以及它大部分时间都花在哪些文件
  • 怎么修 '。'不是内部或外部命令错误

    我遵循了几个链接来尝试解决这个问题 例如link1 http community spiceworks com how to show 36697 how to fix not recognized as an internal or ex
  • C# 保存大图像

    我在尝试使用 C 保存巨大图像 我指的是超过 1 GB 时遇到了困难 基本上 我尝试分部分执行此操作 我有大约 200 个位图源 我需要一种方法在将它们编码为 png 文件之前或之后将它们组合起来 我知道这将需要大量的 RAM 除非我以某种
  • 观察非 ember 全局变量

    我想要一个计算属性来观察非 ember 全局 localStorage 中的特定键 这可能吗 以下似乎并没有削减它 someProperty function some functionality property localStorage
  • 有没有办法忽略文本文件中某些行的读取?

    我正在尝试读取 C 应用程序中的文本文件 但我不想读取前两行或最后一行 文件中有 8 行 所以实际上我只想读取第 3 4 5 6 和 7 行 有什么办法可以做到这一点吗 示例文件 USE Shelley s Other Database C
  • 膨胀类 CollapsingToolbarLayout 时出错

    我的 CollapsingToolbarLayout 由于错误膨胀类 android support design widget CollapsingToolbarLayout 而崩溃 我上周末更新了android studio 更新之前
  • 如何删除firebase中具有指定标题的特定记录

    我在 Web 应用程序中使用 Firebase 数据库 并且有这样的数据 如何删除标题中包含 Apple 的整个记录 图中标记 我写了下面的代码 但它不起作用 请帮助 var abc firebase database ref fireba
  • 如何使用 Selenium Server 2.20 获取执行服务器名称或地址

    使用 Selenium Server 时 记录实际执行 selenium 脚本的计算机的名称非常有用 是否可以获得该信息 我正在使用 C 绑定 但用任何语言回答都可以 我们应该知道 Selenium 服务器在哪里运行 这是Java代码 我们
  • Android 应用内结算可用产品列表

    是否可以通过某种方式从 Play 商店获取所有可用产品的列表 我想要做的是获取所有可用的项目 然后将它们显示在 ListView 中 每当有人点击 ListView 时 就会在 Google Play 商店中打开正确的项目 那可能吗 如果是
  • 仅当其中一个流发生更改时,combineLatest 才会发出

    我有一个具有频繁值的流和一个具有较慢值的流 我想将它们组合起来 但仅当较慢的发出时才发出一个值 所以combineLatest不起作用 就像这样 a1 a2 b1 a2 b1 a3 a4 a5 b2 a5 b2 目前我正在这样做 有没有更干