如何发出错误然后使用 RxJava 发出缓存数据?

how to emit error then emit the cached data using RxJava?

我在 MVP 解决方案中使用 RxJava,我想实现这个场景:

限制条件:

我尝试了什么:

在我的回购中:

    override fun getRepos(userName: String, page: Int, pageSize: Int):Observable<List<Repo>> {

 return githubRemoteService.getReposList(userName, page, pageSize)
                .subscribeOn(schedulersProvider.ioThread())
                .flatMap { repos ->
                    val mappedRepos = remoteResponseMapper.mapRepoResponse(repos)
                    githubLocalService.saveRepos(mappedRepos)
                    Observable.just(mappedRepos)
                }
 .onErrorResumeNext(Observable.just(githubLocalService.getReposList(userName, page, pageSize)))
               .observeOn(schedulersProvider.mainThread())

    }

在我的演示者中:

githubInteractor.getRepos(userName, page, pageSize).subscribe(
            { repos ->
                 showReposInView(repos)
            },
            { error ->
                digestAndShowErrorInView(error)  //the problem is here - no error will be present here
            })

正如我们所知,当我使用 onErrorResumeNext 时,可观察到的源发生了变化,但 永远不会发出错误

如何先发出错误然后发出本地回购数据?

如果不能这样做,我怎样才能改变我的场景以获得相同的场景?

您无法使用 onError 继续直播。 onError 表示发生严重错误,Observable 结束。你不能使用它。

有一个简单的解决方案。您可以将结果包装在指示 error/data 的结构中。例如

sealed class MyData
data class Success(val data: List<Repo>) : MyData
data class Error(val t: Throwable): MyData

您可以将成功的 API 响应映射到 Success,如果出现错误(在 onErrorResumeNext 中),您可以创建一个 Error class并使用 concat 继续本地回购列表。

这样,您在 onNext 中既会出错又会成功,并且不会破坏链条。

onNext 中,您可以使用 when 并适当地处理 error/success。