Действие в цепочке RxJava не работает должным образом - PullRequest
0 голосов
/ 22 ноября 2018

Я новичок в RxJava и RxFirebase, и я делаю систему регистрации для моего приложения.Все шаги в процессе регистрации должны выполняться последовательно, и эта последовательность должна быть прервана в случае сбоя шага.

Это код из моего класса пользовательского интерфейса регистра.Я вызываю register () для другого класса и подписываюсь на возвращаемое значение, которое представляет собой Maybe.

        MyClass.register(username, email, password, photo_uri)
            .subscribe(
                a -> log(a.getUser().getDisplayName()),
                error -> { }                    
            )

Внутри функции регистра у меня есть «цепочка»:

    public Maybe<AuthResult> register(String username, String email, String pass, Uri photo_uri) {
        return RxFirebaseAuth.createUserWithEmailAndPassword(mAuth, email, pass)
            .doAfterSuccess(authResult -> setFirebaseUsername(authResult.getUser(), username))
            .doAfterSuccess(authResult -> setFirestoreUsername(authResult.getUser(), username));
    }

проблема в SetFirestoreUsername:

        public Completable setFirestoreUsername(FirebaseUser user, String username) {
            HashMap<String, Object> profile_data = new HashMap<>();
            profile_data.put("username", username);

            DocumentReference document = FirebaseFirestore.getInstance().collection("users").document(user.getUid());

            // Works
            //RxFirestore.setDocument(document, profile_data).subscribe();

            // Doesn't work
            return RxFirestore.setDocument(document, profile_data);
        }

Если вы посмотрите на комментарии «работает / не работает», разница между фрагментом кода, который работает, и кодом, который не работает, заключается в том, чтопоследний возвращается и используется в цепочке подписки.Я подтвердил, что setFirestoreUsername вызывается.Разница лишь в том, что когда я использую return, внутренняя работа RxFirestore.setDocument просто не работает, но никаких ошибок не выдается.

1 Ответ

0 голосов
/ 22 ноября 2018

Оператор doAfterSuccess() вызывается со значением, текущим через конвейер, в вашем случае setFirestoreUsername(authResult.getUser(), username).Это просто вызов метода, и результат не используется как часть цепочки наблюдателей.

Поскольку он не является частью цепочки наблюдателей, подписка отсутствует.Возможно, вам придется использовать оператор flatMapCompletable() вместо doAfterSuccess().

...