在我的存盤庫中,我有兩個應該按順序完成的 API 呼叫。
- 第一個 API 呼叫回傳 Completable -> 如果這個 API 呼叫失敗,我們不應該繼續,如果成功,我們應該繼續第二個 API 呼叫
- 第二個 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() }
}
視圖模型:
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 呼叫失敗時才拋出錯誤。
uj5u.com熱心網友回復:
采用andThen
activate(id)
.andThen(
fetchAd(id)
.onErrorReturnItem(SummaryAd())
)
uj5u.com熱心網友回復:
這大致是您所需要的,根據您對 _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 one rrorReturn
_state.value = State.ErrorActivation
}
)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478035.html