RXJava2 на Android - вложенная завершаемая не вызывается - PullRequest
0 голосов
/ 13 мая 2018

У меня есть завершаемый метод аутентификации, и я хочу получить данные аутентифицированного пользователя при успешном входе в систему.

Получив их, я хочу вызвать метод onUserAuthenticated.

Я делаю это с вложенным завершаемым (глубиной 2 уровня), так как хочу отправить и токен авторизации, полученный на login, и данные пользователя в метод onUserAuthenticated.

Проблема в том, что onUserAuthenticated никогда не вызывается.

class LoginViewModel(val emailAuthentication: EmailAuthentication) : ViewModel() {

    val email = MutableLiveData<String>()
    val password = MutableLiveData<String>()

    fun login() {
        emailAuthentication.login(email = email.value!!, password = password.value!!)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    Timber.d("User $email logged in")
                }, { error ->
                    Timber.e(error, "Error logging in $email")
                })
    }
}

class EmailAuthenticationImpl(private val authentication: Authentication,
                            private val userRepository: UserRepository,
                            private val authRepository: AuthenticationRepository
) : EmailAuthentication {

    override fun register(email: String, password: String): Completable {
        return userRepository.register(email, password)
    }

    override fun login(email: String, password: String): Completable {
        // some missing fields validation
        return authRepository.login(email, password)
                .flatMapCompletable { token ->
                    userRepository.getCurrentUser()
                            .flatMapCompletable {
                                Completable.defer {
                                    // FIXME this never gets invoked
                                    authentication.onUserAuthenticated(AuthType.EMAIL, it, token)
                                    Completable.complete()
                                }
                            }
                }

    }

Я пытался поставить Completable.defer также только до userRepository.getCurrentUser() и до userRepository.getCurrentUser() и до authentication.onUserAuthenticated(AuthType.EMAIL, it, token), но код никогда не достигается.

Что я делаю не так?

...