#javascript #firebase-authentication
#javascript #firebase-аутентификация
Вопрос:
После проверки кода сброса пароля с помощью Firebase я поместил функцию setTimeout() на ожидание загрузки страницы в течение пяти секунд. Без этого я получаю сообщение об ошибке, в котором говорится, что он не может найти ‘userEmail’, хотя у меня есть функция, которая ожидает загрузки страницы в верхней части моего скрипта. Я разместил несколько журналов консоли, и он останавливается на «начал ожидание», строке прямо перед запуском функции setTimeout (). Электронное письмо <h1>
, которое у меня есть, никогда не обновляется, как предполагалось, после того, как функция setTimeout ожидает 5 секунд для выполнения кода в нем.
function handleResetPassword(code) {
auth.verifyPasswordResetCode(code).then(function (email) {
console.log("Code verified");
var accountEmail = email;
window.location.replace("/email/new-password.html");
console.log("started the wait");
setTimeout(() => {
console.log("finished waiting");
userEmail.innerText = accountEmail;
console.log("set email");
submitNewPasswordBtn.addEventListener('click', function (e) {
console.log("submit btn clicked");
e.preventDefault();
var newPassword = newPaswordInput.value;
var confNewPasword = confNewPaswordInput.value;
if (newPassword != confNewPasword) {
alert("The new passwords must match!");
return;
}
auth.confirmPasswordReset(code, newPassword).then(function (resp) {
console.log("password updated");
auth.signInWithEmailAndPassword(accountEmail, newPassword).then(function () {
alert("Password reset successfully and you have been signed in.");
});
}).catch(function (error) {
console.error("error confirming the password");
console.error(error);
});
});
}, 5000);
}).catch(function (error) {
console.log("we have an error");
console.error(error);
window.location.replace('/email/errors/pswd-resetcode-invalid.html');
});
}
Я ожидал, что электронное письмо <h1>
будет заполнено электронной почтой пользователя, и когда они нажмут кнопку отправки, появится предупреждение о том, что пароль был успешно сброшен, но страница просто ничего не делает, и вывод консоли останавливается на «начал ожидание». Я подождал около 30 секунд, и все равно вывода нет.
Ответ №1:
Это из-за этой строки.
window.location.replace("/email/new-password.html");
Функция setTimeout запускает поток таймера в браузере, но перед инициализацией этого таймера браузер заменяет текущий ресурс на ресурс по указанному URL.
После использования replace() текущая страница не будет сохранена в истории сеансов, а также очищает поток таймера, который не запускает код внутри setTimeout .
Комментарии:
1. Итак, что мне делать? Мне нужно переместить пользователя на эту страницу. Над кодом у меня есть оператор switch, который определяет, какую функцию нужно вызвать, поэтому, прежде чем я вызову функцию handleResetPassword, должен ли я использовать эту строку кода? РЕДАКТИРОВАТЬ: просто попробовал, и это не сработало. Я немного озадачен тем, что делать с этой строкой кода.