我正在尝试创建一个"创建用户"功能在我的网页上。在创建用户时,它同时存储用户编写的数据,例如名称等。在这样做之后,应该向用户呈现仅针对用户的页面,问题在于我的代码在用户的数据之前(名称等)。 )存储,向用户呈现新页面。我该如何防止这种情况发生?
我的创建用户功能:
firebase.auth().createUserWithEmailAndPassword(email, pass).then(function() {
// User is created
const imageUrl = "images/genericProfilePicture.png";
const admin = false;
const currentTime = timeStamp();
var user = firebase.auth().currentUser;
const userId = user.uid;
firebase.database().ref('users/' + userId).set({
name: name,
email: email,
address: address,
zip: zip,
city: city,
department: department,
membership: membership,
admin: admin,
added: currentTime,
profile_picture : imageUrl
});
window.open('frontpage.php', '_top');
}).catch(function(error) {
// Error has happened
var errorCode = error.code;
var errorMessage = error.message;
alert(errorMessage);
});

尝试使用此代码没有任何运气,没有存储数据且没有新页面显示:
firebase.database().ref('users/' + userId).set({
name: name,
email: email,
address: address,
zip: zip,
city: city,
department: department,
membership: membership,
admin: admin,
added: currentTime,
profile_picture : imageUrl
}).then(() => {
window.open('frontpage.php', '_top');
});

答案 0 :(得分:1)
更新内容是异步的,并且您没有收听由例如返回的承诺。您正在使用的.set()
。因此,您只需在开始更新操作后立即执行window.open()
,因此如果更新需要花费大量的毫秒时间,那么您最终将加载下一页在更新完成之前。
因此,正如文档(https://firebase.google.com/docs/database/web/read-and-write)中所建议的那样,使用.set()
返回的promise来确定何时在后端完成更新,然后将用户引导到下一页。在实践中,我猜测它应该就像将window.open
放在.then
的{{1}}块中一样简单。
虽然看起来你需要在做这类事之前先学习承诺的基础知识(例如https://developers.google.com/web/fundamentals/getting-started/primers/promises),但我会给你一个你应该使用的模板:
.set
答案 1 :(得分:1)
选项1 :
只需将set()
与then()
块链接起来:
firebase.database().ref('users/' + userId).set({
name: name,
email: email,
address: address,
zip: zip,
city: city,
department: department,
membership: membership,
admin: admin,
added: currentTime,
profile_picture : imageUrl
}).then(function(){
window.open('frontpage.php', '_top');
}) ...
选项2 :(如果您确实需要验证某些用户详细信息)
您可以检查用户是否已添加到数据库,然后显示该窗口。
类似的东西:
function getUserStatus(uid) {
return firebase.database().ref('/users/' + uid).once('value').then(function(snapshot) {
if (snapshot.val() != null) {
return snapshot.val().name;
}
return '';
});
}
您可以在代码中链接此方法:
firebase.database().ref('users/' + userId).set({
name: name,
email: email,
address: address,
zip: zip,
city: city,
department: department,
membership: membership,
admin: admin,
added: currentTime,
profile_picture : imageUrl
});
getUserStatus(user.uid).then(function(name) {
if (name !== '') {
window.open('frontpage.php', '_top');
}
});
答案 2 :(得分:0)
set
也会返回一个承诺,因此您也需要.then
firebase.database().ref('users/' + userId)
.set()
.then(() => {
window.open('frontpage.php', '_top');
});