android - Rx Java observable 没有发出正确的状态执行一次,初始值传递给折叠
问题描述
enum class CurrentState {
SUCCESS,
FAILURE
}
class ExecutorNode(
private val execute: () -> Observable<CurrentState>
) : Node(emptyArray()) {
override fun getNodeState(): Observable<CurrentState> {
return execute.invoke()
}
}
open class Node(
private val children: Array<Node>
) {
open fun getNodeState(): Observable<CurrentState> {
if (children.isEmpty()) {
return Observable.just(CurrentState.FAILURE)
}
return children.fold(
initial = Observable.just(CurrentState.FAILURE),
operation = { observable: Observable<CurrentState>, node: Node ->
observable.flatMap { nodeState ->
if (nodeState == CurrentState.SUCCESS) {
Observable.just(nodeState)
} else {
node.getNodeState()
}
}
})
}
}
单元测试从这里开始
class NodeTest {
private lateinit var node: Node
val testSubscriber = TestObserver<CurrentState>()
@Before
fun setup() {
val executorNode = ExecutorNode { StateReporter(CurrentState.FAILURE).getNodeState() }
val children = Array(2) { executorNode }
node = Node(children as Array<Node>)
}
@Test
fun getNodeState_FAILURE() {
node.getNodeState().subscribe(testSubscriber)
testSubscriber.assertValueCount(1)
testSubscriber.assertValues(CurrentState.FAILURE)
}
}
class StateReporter(private val nodeState: CurrentState) {
fun getNodeState(): Observable<CurrentState> {
return Observable.just(nodeState).delay(500, TimeUnit.MILLISECONDS)
}
}
当我调试我的代码并测试getNodeState_FAILURE
我在调试我的代码时没有收到任何断言时,我看到只有初始Failure
内部fold
被执行,随后的子节点状态不会返回任何失败。另一方面,节点的属性是,如果任何子节点成功,它就会通过它就像一个 OR 运算符。有人可以指导我为什么观察到的东西没有被订阅。我是否必须在 else 子句 ( node.getNodeState()
) 中再次订阅子节点才能正确遍历树?
解决方案
推荐阅读
- python - 用python左填充
- javascript - 在路由器内快速提供静态文件
- json - 如何将此特定的 varchar 转换为人类可读的日期格式?
- python - Python - 列表和用户输入的列表(用户从更大的列表中选择位置,然后打印带有所选子列表元素的 f 字符串)
- php - 您的 Composer 依赖项需要 PHP 版本 ">= 8.0.0"。您正在运行 7.4.11
- cmake - 无法解析组件“esp_ipc”
- spring - 父表的主键是子表的主键,如何使用jpa进行映射?
- html - 将通过 api 获得的 eventbrite 与会者列表放入 wp html 表中
- javascript - 尝试在 React 中进行阶乘
- python - 输入到 nn.Linear(in_features=16*4*4, out_features=100)