RxJava 链中的操作无法正常工作
Action in RxJava chain not working as it should
我是 RxJava 和 RxFirebase 的新手,我正在为我的应用程序制作一个注册系统。注册过程中的所有步骤都需要按顺序进行,如果某个步骤失败,则该顺序需要中止。
这是我的注册码 UI class。我在另一个 class 上调用 register() 并订阅 return 值,这是一个 Maybe.
MyClass.register(username, email, password, photo_uri)
.subscribe(
a -> log(a.getUser().getDisplayName()),
error -> { }
)
在寄存器函数中我有我的 "chain":
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);
}
如果您看一下 "works / doesn't work" 评论,那段有效的代码和无效的代码之间的区别在于,后者是 returned 并在订阅链。我已验证调用了 setFirestoreUsername。唯一的区别是,当我使用 return 时,RxFirestore.setDocument 的内部工作根本不起作用,但不会抛出任何错误。
使用流经管道的值调用 doAfterSuccess()
运算符,在您的示例中为 setFirestoreUsername(authResult.getUser(), username)
。这只是一个方法调用,结果不用作观察者链的一部分。
因为它不是观察者链的一部分,所以没有订阅。您可能需要使用 flatMapCompletable()
运算符而不是 doAfterSuccess()
.
我是 RxJava 和 RxFirebase 的新手,我正在为我的应用程序制作一个注册系统。注册过程中的所有步骤都需要按顺序进行,如果某个步骤失败,则该顺序需要中止。
这是我的注册码 UI class。我在另一个 class 上调用 register() 并订阅 return 值,这是一个 Maybe.
MyClass.register(username, email, password, photo_uri)
.subscribe(
a -> log(a.getUser().getDisplayName()),
error -> { }
)
在寄存器函数中我有我的 "chain":
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);
}
如果您看一下 "works / doesn't work" 评论,那段有效的代码和无效的代码之间的区别在于,后者是 returned 并在订阅链。我已验证调用了 setFirestoreUsername。唯一的区别是,当我使用 return 时,RxFirestore.setDocument 的内部工作根本不起作用,但不会抛出任何错误。
使用流经管道的值调用 doAfterSuccess()
运算符,在您的示例中为 setFirestoreUsername(authResult.getUser(), username)
。这只是一个方法调用,结果不用作观察者链的一部分。
因为它不是观察者链的一部分,所以没有订阅。您可能需要使用 flatMapCompletable()
运算符而不是 doAfterSuccess()
.