Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.08.2023, 11:46
Новичок на форуме
Отправить личное сообщение для alex_ural Посмотреть профиль Найти все сообщения от alex_ural
 
Регистрация: 06.04.2014
Сообщений: 8

затяжной ajax XMLHttpRequest
Привет всем.
У меня request
$('#installForm').on('beforeSubmit', function (event){
    event.preventDefault();
    $('#submitButton').prop('disabled', true);
    $('#back-button').hide();
    $('#install-note').toggle();
    $('.performance-svg').toggle('slow');

    var progressBar =$('.progress-bar');

     function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
   async function prBarTimer(t, p) {
        if(p>t) {
            for(let t=1; t < p; t++){
              await sleep(500);
              setPercent(t);
            }            
        }
        function setPercent(t) {
            progressBar.css('width', t+'%' );
            progressBar.text(parseInt(t)+'%' );
        }
    } 
    
    var formData =  $('#installForm').serialize();
    var xmlReq = $.ajax({
           type: "POST",
           url: "{$url}",
           xhr: function() {
           var xhr = new window.XMLHttpRequest();
           
            xhr.onreadystatechange = function(){
                if (xhr.readyState == 1) {
                    $('.progress').toggle();
                    prBarTimer(0, 80);
                }
            };
            xhr.onloadend =function(e) {
                   prBarTimer(80, 100);
                   location.href="{$url_upgrate}"
            }
            return  xhr;
        }
    });
});
Я ожидаю, что onloadend запустится prBarTimer(80, 100); Но на самом деле срабатывает location.href. Cкажите пожалуйста, почему так?

Последний раз редактировалось ksa, 14.08.2023 в 12:26. Причина: форматирование кода
Ответить с цитированием
  #2 (permalink)  
Старый 14.08.2023, 12:11
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,608

Ну потому что ты не ждёшь (await) prBarTimer, location.href устанавливается практически одновременно. А когда установлена новая location.href, браузер имеет право игнорировать старую страницу, т.к. с его точки зрения она уже в мусоре.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый Сегодня, 11:51
Новичок на форуме
Отправить личное сообщение для lunahart6374 Посмотреть профиль Найти все сообщения от lunahart6374
 
Регистрация: 08.12.2025
Сообщений: 1

So basically, the issue is that onloadend fires, both functions run, but the browser immediately jumps to location.href before prBarTimer(80, 100) has any chance to finish, right? orbit beats
Since prBarTimer is async and I'm not awaiting it, the redirect happens instantly, and the browser doesn't bother rendering the progress animation because it’s already navigating away.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ajax запрос через метод submit() n0kkw1n AJAX и COMET 7 16.12.2016 22:47
Отправка формы после ajax проверки ShutTap Общие вопросы Javascript 15 08.04.2016 11:46
jQuery Ajax - XMLHttpRequest Infinity178 jQuery 3 15.12.2015 22:23
Объект ajax и приостановка функции kilohertz_. AJAX и COMET 5 18.01.2015 16:33
Ajax разбор метода mycoding jQuery 14 21.05.2010 10:57