【问题标题】:RxJava Maybe: Any neat way to handle Empty case?RxJava Maybe:有什么巧妙的方法来处理 Empty case?
【发布时间】:2018-06-06 15:46:08
【问题描述】:

我被这个问题困住了,这应该很简单。当Maybe 作为Empty Maybe 完成时,我需要订阅者执行代码块。我发现了

  1. 我们可以传递默认的 Maybe 值或使用 switchIfEmpty 但我觉得两者都很老套。
  2. 还有一个订阅函数,它接受 onComplete 函数(以及其他两个事件的处理程序),但 onComplete 不接受任何可用于查找是否已完成空的参数。
  3. 另一种方式可能是Maybe.isEmpty.blockingGet(),但它也很脏。

我尝试了以下(Kotlin 语法):-

fun <T> Maybe<T>.subscribeWithEmptyHandler(onSuccess: (T) -> Unit, onError: (Throwable) -> Unit, onEmpty: () -> Unit) {
    this.isEmpty.subscribe({ if (it) onEmpty() }, { onError(it) })
    this.subscribe({ onSuccess(it) }, { onError(it) })
}

但正如预期的那样,它运行了两次订阅,在这里测试:-

Maybe.create<Int> {
    println("subscribing")
    //Remove line below to create Empty Maybe
    it.onSuccess(5)
    it.onComplete()
}
    .subscribeWithEmptyHandler({println("success")},{println("error")},{println("empty")})

有人可以提出更简洁的方法来解决这个问题吗?

【问题讨论】:

    标签: kotlin rx-java rx-kotlin


    【解决方案1】:

    使用Maybe.doOnEvent(java 示例):

    Maybe
     .empty()
     .doOnEvent((value, error)-> {
        if (value==null && error == null) {
          System.out.println("empty!");
        }})
     .subscribe();
    

    【讨论】:

    • 嘿戴夫,它成功了,我不知道成功和完成是相互排斥的事件。在这种情况下,您认为我们也可以使用 .doOnComplete 吗?
    • 有了doOnComplete,我们就不需要空检查了吗?
    【解决方案2】:

    我做了以下比我在问题中写的更整洁:-

    fun <T> Maybe<T>.subscribeWithEmptyHandler(onSuccess: (T) -> Unit, onError: (Throwable) -> Unit, onEmpty: () -> Unit) {
        this.toSingle()
            .subscribe(
                { onSuccess(it) },
                { if (it is NoSuchElementException) onEmpty() else onError(it) }
            )
    }
    

    这里它只订阅一次并且不涉及创建新的默认值。仍然不确定这是否是最好的方法。

    【讨论】:

    • 请注意,在这个用例中依赖抛出异常会降低性能(构建堆栈跟踪的成本很高)。出于这个原因,我不推荐它。
    【解决方案3】:

    有一个使用flatMap的解决方案

    return Maybe.just<String>(smth)
                    .flatMap(
                        Function {
                            Maybe.just(it) // onSuccess
                        },
                        Function {
                            Maybe.error(it) // onError
                        },
                        Callable { // onComplete
                            Maybe.just("Empty")
                        }
                    )
    

    或者

    return Maybe.just<String>(smth)
                    .flatMap(
                        {
                            Maybe.just<String>(it) // onSuccess
                        },
                        {
                            Maybe.error(it) // onError
                        },
                        {
                            Maybe.just("Empty") // onComplete
                        }
                    )
    

    【讨论】:

    • 这太棒了!谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多