将回调附加到onauthStateChanged侦听器firebase

时间:2019-03-27 13:51:12

标签: javascript firebase firebase-authentication

我有这段代码,我只需要返回一个uid,以便以后可以使用该ID进行Firestore操作

$(document).ready(function () {
    var uid;
    auth.onAuthStateChanged(function (user) {
        if (user != null) {
            uid = user.uid; 
            console.log(typeof uid)//returns a string ;
        }
    });

    console.log(uid);
    function fetch() {
        var docRef = db.collection("Users").doc(uid);
        docRef.get().then(function (doc) {
            console.log(doc.data);
        }).catch(function (error) {
            console.log("Error getting document:", error);
        });
    }
});

如何存储uid以便以后检索它以进行数据库操作。 当前,运行check函数将返回错误uid未定义。如果尝试登录uid进行控制台,则相同。 我猜该函数在侦听器解析之前运行,但是我将如何解决此问题。由于用户之间的互联网连接速度不同,设置计时器也无济于事

(添加代码)

check1();
check3();
//fetch();

function check1() {
    if (typeof uid === 'undefined') {
        console.log("not ready");
        return false
    }
}

function check3() {
    if (check1 == false) {
        check1();
    } else {
        console.log("ready");  //here this logs ready
        console.log(typeof uid); //then here it logs "undefined" still
        fetch(); //so this function call brings the error
    }
}

function fetch() {
    var docRef = db.collection("Users").doc(uid);
    docRef.get().then(function (doc) {
        console.log(doc.data();
    }).catch(function (error) {
        console.log("Error getting document:", error);
    });
}

如果check3未定义,为什么uid函数会准备好记录。我还需要隐藏一个特定的链接,直到uid有一个值为止。 我该如何改善上面的代码而保留链接

1 个答案:

答案 0 :(得分:1)

您的猜测几乎可以肯定是正确的,即您在身份验证成功完成之前正在呼叫check。设置计时器并不能真正帮助您防弹。

由于我们不知道您何时或在什么条件下需要致电check,因此很难建议采取其他措施。至少,check应该检查uid是否尚未定义,如果不存在,请拒绝执行任何操作。

通常,将对UI进行编码,直到用户成功登录后才允许用户执行任何操作。