Javascript 创建用户,保存数据,然后更改页面
我正在尝试在我的网页上创建“创建用户”功能。当创建用户时,它同时存储用户编写的数据,如名称等。在这样做之后,用户应仅为用户显示一个页面,问题在于我的代码,在存储用户数据(名称等)之前,用户将显示一个新页面。我怎样才能防止这种情况发生 我的创建用户功能:Javascript 创建用户,保存数据,然后更改页面,javascript,firebase,firebase-realtime-database,firebase-authentication,Javascript,Firebase,Firebase Realtime Database,Firebase Authentication,我正在尝试在我的网页上创建“创建用户”功能。当创建用户时,它同时存储用户编写的数据,如名称等。在这样做之后,用户应仅为用户显示一个页面,问题在于我的代码,在存储用户数据(名称等)之前,用户将显示一个新页面。我怎样才能防止这种情况发生 我的创建用户功能: firebase.auth(){ //用户已创建 const imageUrl=“images/genericProfilePicture.png”; const admin=false; const currentTime=时间戳(); va
firebase.auth(){
//用户已创建
const imageUrl=“images/genericProfilePicture.png”;
const admin=false;
const currentTime=时间戳();
var user=firebase.auth().currentUser;
const userId=user.uid;
firebase.database().ref('users/'+userId).set({
姓名:姓名,,
电邮:电邮,,
地址:地址:,
zip:zip,
城市:城市,,
部门:部门,,
成员:成员,
管理员:管理员,
增加:当前时间,
个人资料图片:imageUrl
});
open('frontpage.php','u top');
}).catch(函数(错误){
//发生了错误
var errorCode=error.code;
var errorMessage=error.message;
警报(错误消息);
});代码>更新内容是异步的,并且您没有监听您正在使用的.set()
返回的承诺。因此,您只需在启动更新操作后立即执行window.open()
,因此,如果更新需要相当长的毫秒(通常都是如此),那么您将在更新完成之前加载下一页
因此,正如文档()中所建议的,使用.set()
返回的承诺来确定何时在后端完成更新,然后才将用户引导到下一页。在实践中,我猜想它应该像放置窗口一样简单。在中打开。然后为设置块
虽然在做这类事情之前,你需要先学习承诺的基础知识(例如),但我只想给你一个你应该使用的模板:
somethingsomething
.set(...)
.then( function{
window.open(...);
});
set
也会返回一个承诺,因此您需要。然后再
firebase.database().ref('users/' + userId)
.set()
.then(() => {
window.open('frontpage.php', '_top');
});
选项1:
只需使用then()
块链接set()
:
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');
}
});
但是我已经在使用“then”来创建用户函数了?是的,但是没有什么可以阻止你嵌套承诺。(显然,如果嵌套太多,可能会变得很糟糕,但你只有两个)。我用代码编辑了这个问题,然后尝试使用另一个,但没有存储数据,也没有显示新页面?你在使用ES6吗?如果不是,另一个答案的语法是错误的。我真的不知道。我不熟悉javascript,只是想学习。我用你的代码编辑了我的问题,但没有存储任何数据,也没有新页面显示:(