Почему моя функция setTimeout() не выполняет код после 5-секундного таймера, который я ей дал?

#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, должен ли я использовать эту строку кода? РЕДАКТИРОВАТЬ: просто попробовал, и это не сработало. Я немного озадачен тем, что делать с этой строкой кода.