Я работаю над функцией регистрации приложений с использованием Firebase Authentication & Firestore. На данный момент, когда я создаю пользователя, я хочу также создать файл в моем Firestore. Однако моя функция onAuthStateChanged() просто пропускает эту операцию.
firebase.auth().onAuthStateChanged(function(user) {
//User is signed in.
if (user) {
console.info("This happened.");
//Create the Users document in the Firestore Database.
firestore.collection("Users").doc(email).set({
UserEmail: email,
UserRole: role
}).then(function() {
console.info("Document successfully written!");
}).catch(function(error) {
console.error("Error writing document: " + error);
});
console.info("This also happened.");
//Redirect user to the dashboard for their role.
if (role === "Customer") window.location.replace("customer.html");
else if (role === "Manager") window.location.replace("manager.html");
else if (role === "Deliverer") window.location.replace("deliverer.html");
else console.info("The value of role is not an accepted value: " + role + ".");
}
});Запустив это в браузере, я вижу оба сообщения «Это произошло». и «Так тоже было». консольные выходные данные и не получают никаких других консольных выходных данных или ошибок. Он также завершает перенаправления в нижней части оператора if. У меня было много проблем с этой функцией в этом файле, а также в других, поэтому любая помощь будет очень признательна! Спасибо!
переместите код в ветку .then(); иначе вы бы победили идею обещаний и асинхронной операции...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Любой код, которому требуется состояние входа пользователя, должен находиться внутри обратного вызова onAuthStateChanged. Вы уже сделали это, так что вы на полпути.
Любой код, который должен выполняться после успешной записи данных в базу данных, должен быть внутри обратного вызова then(). Так:
firebase.auth().onAuthStateChanged(function(user) {
//User is signed in.
if (user) {
//Create the Users document in the Firestore Database.
firestore.collection("Users").doc(email).set({
UserEmail: email,
UserRole: role
}).then(function() {
console.info("Document successfully written!");
//Redirect user to the dashboard for their role.
if (role === "Customer") window.location.replace("customer.html");
else if (role === "Manager") window.location.replace("manager.html");
else if (role === "Deliverer") window.location.replace("deliverer.html");
else console.info("The value of role is not an accepted value: " + role + ".");
else console.info("The value of role is not an accepted value: " + role + ".");
}).catch(function(error) {
console.error("Error writing document: " + error);
});
}
});
Как вы показываете сейчас, электронная почта не назначается. Тем не менее, рассмотрите возможность использования UID пользователя в качестве идентификатора документа вместо электронной почты. Также подумайте, действительно ли изменяемая страница останавливает выполнение javascript на ней, так что операция Firestore никогда не завершается.