прикрепить обратный вызов к firebase прослушивателя onAuthStateChanged

#javascript #firebase #firebase-authentication

#javascript #firebase #firebase-аутентификация

Вопрос:

У меня есть этот код, который мне нужен, чтобы просто вернуть uid, чтобы я мог позже использовать идентификатор для выполнения операций 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:

Ваше предположение почти наверняка верно, что вы вызываете check до успешного завершения аутентификации. Установка таймера на самом деле не поможет, это становится пуленепробиваемым.

Поскольку мы не знаем, когда и при каких условиях вам нужно вызвать check , трудно рекомендовать другой курс действий. По крайней мере, check следует проверить, еще не определен ли uid, и отказаться что-либо делать, если его там нет.

Обычно пользовательские интерфейсы будут закодированы так, чтобы не позволять пользователю что-либо делать, пока он успешно не войдет в систему.