我是RxJava和RxFirebase的新手,并且正在为我的应用制作注册系统。注册过程中的所有步骤都需要按顺序进行,如果步骤失败,则需要中止该顺序。
这是我的注册UI类中的代码。我在另一个类上调用register()并订阅返回值,即Maybe。
function Scrap() {
this.loadPage = async function(url, loadTime) {
ph_instance = await phantom.create();
ph_page = await ph_instance.createPage();
var status = await ph_page.open(url); // Load the Pages
if (status == 'success') {
async function waitMore() {
let p = new Promise(function(res, rej) {
setTimeout(async function() {
var pages, jobs;
jobs = await someFunction1();
pages = await someFunction2();
if (jobs === '' || pages === '' || jobs === 'undefined' || pages === 'undefined' || jobs === null || pages === null) {
waitMore();
} else {
res({
success: true,
data: {
"jobs": jobs,
"pages": pages
}
});
}
}, loadTime);
});
var res = await p;
return res;
}
return waitMore();
};
}
}
new Scrap().loadPage("example.com", 5000).then(function(res) {
console.log("Response ", res);
})
在注册功能中,我有我的“链”:
MyClass.register(username, email, password, photo_uri)
.subscribe(
a -> log(a.getUser().getDisplayName()),
error -> { }
)
问题出在SetFirestoreUsername中:
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被调用。唯一的区别是,当我使用return时,RxFirestore.setDocument的内部工作原理根本不起作用,但不会引发任何错误。
答案 0 :(得分:0)
在您使用doAfterSuccess()
的情况下,将使用流经管道的值调用setFirestoreUsername(authResult.getUser(), username)
运算符。这只是一个方法调用,结果不用作观察者链的一部分。
由于它不是观察者链的一部分,因此没有订阅。您可能需要使用flatMapCompletable()
运算符而不是doAfterSuccess()
。