【问题标题】:Converting Rx-Observables to Twitter Futures in Scala在 Scala 中将 Rx-Observables 转换为 Twitter 期货
【发布时间】:2018-01-10 17:27:42
【问题描述】:

我想以最被动的方式实现以下功能。我需要这些来实现上述类型之间自动转换的双射。

def convertScalaRXObservableToTwitterFuture[A](a: Observable[A]): TwitterFuture[A] = ???
def convertScalaRXObservableToTwitterFutureList[A](a: Observable[A]): TwitterFuture[List[A]] = ???

我遇到了this 有关相关主题的文章,但我无法让它发挥作用。

【问题讨论】:

  • 那是哪篇文章?
  • 哎呀。对不起。立即添加链接。

标签: scala rx-java rx-scala


【解决方案1】:

不幸的是,那篇文章中的说法不正确,ObservableFuture 之类的东西之间不可能存在真正的双射。问题是Observable 是更强大的抽象,可以表示Future 无法表示的事物。例如,Observable 实际上可能代表一个无限序列。例如参见Observable.interval。显然没有办法用Future 来表示这样的事情。那篇文章中使用的Observable.toList 调用明确提到:

返回一个发射单个项目的Single,一个由有限ObservableSource发射的所有项目组成的列表。

后来它说:

无限且永远不会完成的源永远不会通过此运算符发出任何内容,无限源可能会导致致命的 OutOfMemoryError。

即使你把自己限制在有限的Observables,Future 仍然不能完全表达Observable 的语义。考虑Observable.intervalRange,它在某个时间段内一一生成有限范围。对于Observable,第一个事件出现在initialDelay 之后,然后你会得到每个period 的事件。使用Future,您只能获得一个事件,并且必须仅在序列完全生成时才能获得Observable 完成。这意味着通过将Observable[A] 转换为Future[List[A]],您会立即破坏Observable 的主要好处- 反应性:您不能一个一个地处理事件,您必须将它们全部处理成一堆。

总结文章第一段的主张:

在两者之间进行转换,而不会失去它们的异步和事件驱动性质。

是错误的,因为转换 Observable[A] -> Future[List[A]] 完全失去了 Observable 的“事件驱动性质”,并且没有办法解决这个问题。

附:实际上,Future 不如Observable 强大这一事实应该不足为奇。如果不是,为什么有人会首先创建Observable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多