当 stream2 基于 stream1 时,如何避免 .zip(stream1, stream2, BiFun) 订阅 stream1 两次?

How do I avoid .zip(stream1, stream2, BiFun) subscribing to stream1 twice, when stream2 is based on stream1?

我在 android 中使用 firebase 处理一些复杂的数据。我需要保存引用,但我的 zip 操作或我处理 RX 的方式出现了问题。

我想用关于某个 B 的信息创建一个新的 A object,并更新我的 B object 以获得关于创建的 A 的信息。当 firebase 操作都成功后,我将 return Single<A>

val singleA = firebaseCall(A("ABC", bKey))

val singleB = singleA.flatMap{ a -> firebaseCall(B(aKey)) }

return Single.zip(singleA, singleB, BiFunction { a, b -> a })

在浏览 logcat 时,我可以看到 SingleA 订阅了两次,并向 firebase 推送了两次。我想避免这种情况!

那么,当 B 依赖于 A 时,如何在 A 和 B 上使用 zip 函数;并且没有执行两次 A?

你真的不需要 zip 因为你可以简单映射 a 返回:

val singleA = firebaseCall(A("ABC", bKey))

return singleA.flatMap{ a -> firebaseCall(B(aKey)).map { a } }