0

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

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

我在相关主题上看到了这篇文章,但我无法让它发挥作用。

4

1 回答 1

2

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

返回Single发出单个项目的 a ,由有限源发出的所有项目组成的列表ObservableSource

后来它说:

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

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

总结文章第一段的主张:

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

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

PS 实际上,Future没有那么强大的事实不Observable应该是一个大惊喜。如果不是,为什么有人会Observable首先创造?

于 2018-01-10T23:14:27.107 回答