0

我是 RxJava 的新手,在尝试了我在网上可以找到的所有东西几天后,我发现我真的需要帮助。

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

只要我的 2 个来源之一返回了某些内容,它就可以正常工作,但是如果两个来源都返回错误,则会出现问题:当我过滤掉错误时,它不会返回任何内容,并且永远不会调用我的订阅。

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

这是我的存储库中的 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
    }
}
4

1 回答 1

0

最后,我设法通过添加:

 .defaultIfEmpty(MemberModel(-1)) 

并检查 id == -1。

于 2020-04-05T10:27:54.693 回答