将两个 RxJava 请求转换为一个请求

Convert two RxJava requests to one request

我有两个使用 RxJava 执行的请求。他们应该运行一个接一个。这就是我目前所拥有的:

   fun showPhotos() {
            _liveData.postValue(Resource.Loading())
            compositeDisposable.add(useCase.getPhotos()
                .subscribe({
                    showPosts(it)
                }) {
                    _liveData.postValue(Resource.Failure(it.localizedMessage))
                    Timber.e(it)
                })
        }


    private fun showPosts(networkPhotos: List<NetworkPhoto>) {
        compositeDisposable.add(useCase.getPost()
            .subscribe({ networkPosts ->
                _liveData.postValue(
                    Resource.Success(PostAndImages(networkPosts, networkPhotos).asDomaineModel())
                )
            }) {
                _liveData.postValue(Resource.Failure(it.localizedMessage))
                Timber.e(it)
            })
    }

有没有什么解决方案可以让我调用一个 RxJava 而不是顺序执行两个请求?

如果需要顺序运行2个查询,可以使用flatMap操作符。

data class RequestWrapper(var photos: YourType? = null, var networkPosts : YourType? = null)

fun sequentiallyRequest(){
    val requestWrapper = RequestWrapper()

useCase.getPhotos()
    .map{requestWrapper.photos= it}
    .flatMap{useCase.getPost()}
    .map{requestWrapper.networkPosts = it}
    .subscribe({
         _liveData.postValue(
                Resource.Success(PostAndImages(requestWrapper.networkPosts, networkPhotos).asDomaineModel())
            )
})

或者,使用运算符 zip。但在这种情况下,请求将并行执行。

Single.zip(
     useCase.getPhotos(),
     useCase.getPost(),
     Pair::new)
     .subscribe(pair -> {
         showPosts(pair.first)
         _liveData.postValue(
                Resource.Success(PostAndImages(pair.second, networkPhotos).asDomaineModel())
}

你可以使用 .flatMap() 如果一个依赖另一个或者 .zip() 如果你只需要同时 运行 它们并在两者完成后合并它们

您可以使用 zip。查询将按顺序进行。

Single.Zip(
  useCase.getPhotos().subscribeOn(Schedulers.newThread()),
  useCase.getPost().subscribeOn(Schedulers.newThread()),
  BiFunction { photos: ????, posts: ???? -> Pair(photos, posts) }
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
  it.first is photos
  it.second is posts
},{
  error
})