让我们采用 Rx 编写的两种方法:
Maybe<Foo> getFooFromLocal
Single<Foo> getFooFromNetwork
当我们检查Foo的本地存储时,我想写一个链。如果我们没有任何Foo,我们应该从网络中获取它,然后将其保存到本地存储中,然后再次从本地存储中获取它并将其传递给我们的订阅者。
storage
.getFooFromLocal()
.switchIfEmpty(network.getFooFromNetwork().map { it[0] }
.flatMapCompletable { storage.saveFoo(it) }
.andThen(storage.getFooFromLocal()))
.subscriber(/**/)
问题是在可andThen
完成传递到flatMapCompletable
. 我发现如果我换成Maybe.defer{}
. 但是根据andThen
它的文档
返回
Maybe
将订阅此 Completable 的 a。
也许已经
表示可能值或异常的延迟计算和发射
所以问题是为什么我的andThen
部分在完成之前运行。编写这种链的最佳和优雅的方式是什么。
通话记录:
06:05:58.803 getFooFromLocal
06:05:58.804 getFooFromLocal
06:05:58.804 getFooFromNetwork
06:05:59.963 saveFoo