RxJava ConcatArrayDelayError和过滤器:仅在两个源均失败时才返回错误

问题描述 投票:0回答:1

我是RxJava的新手,在尝试了几天可以在网上找到的所有内容之后,我发现我确实需要这一方面的帮助。

我从本地和远程资源中获取我的存储库中的成员。我添加了一些运算符来优先(通过反跳)返回我的远程源,并过滤掉错误,因此如果其中一个远程不可用或数据库为空,它将仅返回2个中的1个。]

只要我的两个来源之一返回某东西,它就可以正常工作,但是如果两个来源都返回错误,就会出现问题:当我滤除错误时,它不会返回任何东西,并且永远不会调用我的订阅。] >

也许有一个简单的解决方案,但到目前为止我还没有找到,有人可以帮忙吗?

这是我的存储库中的fetchMember():

override fun fetchMember(): Observable<MemberModel?> {
    return Observable.concatArrayDelayError(memberLocalSource.fetchMember(), memberRemoteSource.fetchMember())
            .doOnNext { member ->
                saveMember(member!!)
            }
            .materialize()
            .filter { !it.isOnError }
            .dematerialize { it -> it }
            .debounce(400, TimeUnit.MILLISECONDS)
   }

这是我的视图模型:

fun fetchToken(username: String, password: String) {
    val loginDisposable = authApiService.loginWithJWT(username, password)
            .flatMap {
                isAuthenticated = isTokenValid(username, password, it)
                sharedPreferences.setHasValidCredentials(isAuthenticated)
                memberRepository.fetchMember()
            }
            .subscribeOn(Schedulers.io())
            .observeOn((AndroidSchedulers.mainThread()))
            .doOnError { throwable ->
                throwable.printStackTrace()
            }
            .subscribe(
                    { member -> 
                        memberLiveData.value = member
                        this.memberId = member!!.id.toString()
                        this.memberName = member.name.split(" ")[0]
                        if(isAuthenticated) {
                            authenticationState.value = AuthenticationState.AUTHENTICATED_VALID_MEMBER
                        } else {
                            authenticationState.value = AuthenticationState.UNAUTHENTICATED_VALID_MEMBER
                        }
                    },
                    { error ->
                        if(isAuthenticated) {
                            authenticationState.value = AuthenticationState.AUTHENTICATED_INVALID_MEMBER
                        } else {
                            authenticationState.value = AuthenticationState.INVALID_AUTHENTICATION
                        }
                    })
    disposable.add(loginDisposable)
}

private fun isTokenValid(username: String, password: String, authResponse: AuthModel): Boolean {
    return if (authResponse.data != null) {
        false
    } else {
        tokenInterceptor.token = authResponse.token
        val tokenWithCredentials = AuthModel(authResponse.token, null, null, username, password)
        tokenRepository.saveToken(tokenWithCredentials)
        true
    }
}

我是RxJava的新手,经过几天的尝试,我可以在网上找到所有东西,我发现我确实需要这一方面的帮助。我从本地和远程源中获取资源库中的成员。我添加了...

android observable rx-java2 repository-pattern rx-kotlin2
1个回答
0
投票

最后我设法通过添加使其起作用:

 .defaultIfEmpty(MemberModel(-1)) 
© www.soinside.com 2019 - 2024. All rights reserved.