Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.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 Firebase web实时数据库未更新_Javascript_Firebase_Firebase Realtime Database_Firebase Authentication - Fatal编程技术网

Javascript Firebase web实时数据库未更新

Javascript Firebase web实时数据库未更新,javascript,firebase,firebase-realtime-database,firebase-authentication,Javascript,Firebase,Firebase Realtime Database,Firebase Authentication,当我通过firebase密码验证创建新用户时,我正在尝试使用用户信息更新firebase实时数据库。成功登录后,我将转到另一页。问题是,我的数据库没有得到更新,但在上述情况下,如果留在登录页面,不改变任何其他网址;数据库得到更新 这是我的创建用户代码 firebase .auth() .createUserWithEmailAndPassword(email, password) .then((userCredential) => { // Sign

当我通过firebase密码验证创建新用户时,我正在尝试使用用户信息更新firebase实时数据库。成功登录后,我将转到另一页。问题是,我的数据库没有得到更新,但在上述情况下,如果留在登录页面,不改变任何其他网址;数据库得到更新

这是我的创建用户代码

firebase
    .auth()
    .createUserWithEmailAndPassword(email, password)
    .then((userCredential) => {
        // Signed in
        var user = userCredential.user;
        if (user !== null) {
            const db = firebase.database();
            db.ref("/").set({
                uid: user.uid,
            });
        }
        // ...
    })
    .catch((error) => {
        var errorCode = error.code;
        var errorMessage = error.message;
        console.log(errorCode, errorMessage);
        // ..
    });
这是我切换到另一页的地方

firebase.auth().onAuthStateChanged((user) => {
    if (user) {
        // User is signed in, see docs for a list of available properties
        // https://firebase.google.com/docs/reference/js/firebase.User
        var uid = user.uid;
        console.log(user);
        //If I remove the below line, database is updated
        window.location.href = "../html/home.html";
        // ...
    } else {
        // User is signed out
        // ...
        console.log("not logged in");
    }
});

此调用是异步的:

db.ref("/").set({
  uid: user.uid,
});
这意味着在
set()
函数返回后,代码将继续运行,并将数据异步发送到数据库。但是当您更改
window.location
时,它会中断此写入操作。这也是为什么当您不将用户发送到新位置时,它可以工作的原因:写入操作可以在不中断的情况下完成

一个简单的快速修复方法是在更新数据库时标记:


isCreatingUser=true;//我尝试使用此状态标志方法,并且可以成功更新数据库,但现在未执行window.location。我是否需要异步执行此操作。是的,您需要在数据库写入完成后调用此操作,因为此时,
onAuthStateChanged
将已经运行。我更新了我的答案来说明这一点。这非常有效。谢谢@Frank