首页 > 解决方案 > 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()) 中再次订阅子节点才能正确遍历树?

标签: androidkotlinjunitrx-javarx-java2

解决方案


推荐阅读