链可完成和单个RxJava + Retrofit



在我的存储库中,我有两个API调用应该依次执行。

  1. 第一个API调用返回Completable ->如果这个API调用失败,我们不应该继续,如果它成功,我们应该继续第二个API调用
  2. 第二个API调用返回Single ->如果这个API调用失败,我们不应该抛出一个错误,我们仍然可以继续

我怎样才能做到这一点?

我现在做的是使用单独的调用从repo。

存储库:

override fun activate(id: String): Completable {
return api1.post(Body(id = id))
.subscribeOn(schedulerProvider.io())
}
override fun fetchAd(id: String): Single<SummaryAd> {
return api2.getAd(adId)
.subscribeOn(schedulerProvider.io())
.map { it.toSummaryAd() }
}

ViewModel:

private fun activate(id: String) {
repository.activate(id)
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.subscribe(
{ // if it is successful, let's continue
fetchAd(id)
},
{ // otherwise fail
_state.value = State.ErrorActivation
}
).also { compositeDisposable.add(it) }
}
private fun fetchAd(id: String) {
repo.fetchAd(id)
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.subscribe(
{ // success
_state.value = State.ActivationSuccess(it)
},
{
// even though the call has failed, the activation is succeeded, so we still can proceed but with empty data
_state.value = State.ActivationSuccess(SummaryAd())
}
).also { compositeDisposable.add(it) }
}

基本上我最终想要的是在我的viewModel中有一个函数,让存储库顺序调用它们,如果第一个API调用失败,只抛出错误。

使用andThen

activate(id)
.andThen(
fetchAd(id)
.onErrorReturnItem(SummaryAd())
)

这大概就是您所需要的,根据_state的实现,您可能也不需要在UI线程上设置它的值。

compositeDisposable.add(
repository.activate(id)
.subscribeOn(schedulerProvider.io())
.andThen{
repo.fetchAd(id)
.subscribeOn(Schedulers.io())
.onErrorReturnItem { SummaryAd() }
}
.observeOn(schedulerProvider.ui())
.subscribe(
{
_state.value = State.ActivationSuccess(it)
},
{
// this will be executed only, in case of activate request failure, as fetch add can never fail due to onErrorReturn
_state.value = State.ErrorActivation
}
)
)

相关内容

  • 没有找到相关文章

最新更新