【问题标题】:Better way to chain rxjava2 calls with conditional operations使用条件操作链接 rxjava2 调用的更好方法
【发布时间】:2018-02-15 15:46:46
【问题描述】:

我有以下代码,它执行一次调用,获取调用的结果,这是一个布尔值,然后如果结果为 false,则进行第二次调用。

private fun linkEmailAndTextTogether(contactPhoneNumber: ContactPhoneNumbers,phoneNumber : PhoneNumber) {
    val single = SingleOnSubscribe<Boolean> {
        contactPhoneNumber.doesEmailContactExist(phoneNumber)
    }
    Single.create(single)
            .subscribeOn(Schedulers.io())
            .subscribeWith(object : SingleObserver<Boolean> {
                override fun onSuccess(phoneNumberDoesExist: Boolean) {
                    if (!phoneNumberDoesExist) {
                        val completable = CompletableOnSubscribe {
                            contactPhoneNumber.linkEmailAndTextTogether(phoneNumber)
                        }
                        compositeDisposable.add(Completable.create(completable)
                                .subscribeOn(Schedulers.io())
                                .subscribe())
                    }
                }

                override fun onSubscribe(d: Disposable) {
                    compositeDisposable.add(d)
                }

                override fun onError(e: Throwable) {
                    Timber.e(e,e.localizedMessage)
                }


            })
}

似乎应该有一种更优雅的方式在某种链中执行此操作。

【问题讨论】:

  • 这并没有真正帮助我理解我应该做什么。不过谢谢。
  • 第二个返回值是否总是布尔值?
  • @Blackbelt - 是的
  • 那你为什么不使用地图运算符之一呢?

标签: android reactive-programming rx-java2


【解决方案1】:

您可以使用flatMap 运算符 - 缺点是您不知道第一个或第二个是否失败。

  Single.just(phoneNumber)
       .subscribeOn(Schedulers.io())
       .map { it -> contactPhoneNumber.doesEmailContactExist(it) }
       .flatMap { it ->
             if (it) {
                 return@flatMap contactPhoneNumber.linkEmailAndTextTogether(phoneNumber)
              }
              Single.just(it)
        }.subscribe({}, Throwable::printStackTrace);

【讨论】:

    【解决方案2】:

    这应该会有所帮助。

    val single = SingleOnSubscribe<Boolean> {
         getSingle()
       }
    
       Single.create(single).map({
        if (it){
            return@map getCompleteable()
        }
        return@map Completable.complete()
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 2023-01-27
      相关资源
      最近更新 更多