Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 创建用户,保存数据,然后更改页面_Javascript_Firebase_Firebase Realtime Database_Firebase Authentication - Fatal编程技术网

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,只是想学习。我用你的代码编辑了我的问题,但没有存储任何数据,也没有新页面显示:(