RxJava Может быть, есть какой-нибудь изящный способ справиться с пустым делом? - PullRequest
0 голосов
/ 06 июня 2018

Я застрял в этой проблеме, которая должна быть довольно простой.Мне нужен подписчик для выполнения блока кода, когда 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")})

Может кто-нибудь предложить более точный способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Использование Maybe.doOnEvent (пример Java):

Maybe
 .empty()
 .doOnEvent((value, error)-> {
    if (value==null && error == null) {
      System.out.println("empty!");
    }})
 .subscribe();
0 голосов
/ 06 июня 2018

Я сделал следующее, что точнее, чем все, что я написал в вопросе: -

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) }
        )
}

Здесь он подписывается только один раз и не требует создания новых значений по умолчанию.Все еще не уверен, что это лучший способ.

...