代码之家  ›  专栏  ›  技术社区  ›  Kristy Welsh

使用条件操作链接rxjava2调用的更好方法

  •  0
  • Kristy Welsh  · 技术社区  · 8 年前

    我有以下代码,它执行一次调用,获取调用的结果,这是一个布尔值,如果结果为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)
                    }
    
    
                })
    }
    

    似乎应该有一种更优雅的方式在某种链中实现这一点。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Blackbelt    8 年前

    您可以使用 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
  •  1
  •   karandeep singh    8 年前

    这应该会有所帮助。

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