RxJava defer 的惰性

Laziness with RxJava defer

我正在阅读一本讲述如何在遗留阻塞代码中引入 RxJava 的书。

它基本上是这样做的:

Observalbe.defer(() -> {return Observable.from(someBlockingMethodTofetchDBRecords(....))});

它说 defer 会在程序中引入惰性。但是默认情况下不是 Observable 惰性的。 Observable.from 应该 return 一个 observable 并且在我们订阅它之前它不会做任何事情。那么为什么我们需要在这里延迟?

因为 someBlockingMethodTofetchDBRecords 不是懒惰的,你把它的结果交给 Observable 之后。

是的,Observable 默认情况下是惰性的,因此在 Observer 订阅之前它们不会执行订阅操作。但是,from 的订阅操作是迭代 现有的 序列并发出其值。该序列是在 Observable.

之外传递并创建的

因此,如果您需要仅在存在 Observer 时才创建序列本身,则其创建必须是订阅操作的一部分,其中 defer 是实现这一目标的运营商。