Работает ли этот JS-код так, как ожидалось?

StackOverflow https://stackoverflow.com/questions/612149

  •  03-07-2019
  •  | 
  •  

Вопрос

Каждые 3 секунды я делаю запрос AJAX POST, чтобы получить статус процесса.Это отлично работает.

Когда процесс достигает 100%, выполняется функция обратного вызова (указана ниже) для добавления новых элементов на страницу, а затем она отменяет метод setTimeout, который используется для непрерывного получения прогресса каждые 3 секунды.Тем не менее, мои пользователи сказали мне, что иногда не удается отменить, и новые элементы не добавляются на страницу, и я обнаружил, что она застревает при показе "100%".

Я тестировал это снова и снова, и у меня это никогда не застревало.Код также выглядит нормально, но мои навыки работы с JavaScript невелики, поэтому я надеялся, что кто-нибудь сможет указать, существует ли вероятность возникновения этой проблемы?

Я прокомментировал код, прошу прощения, он очень длинный.Я попытался уменьшить это.

function convertNow(validURL){

    startTime = setTimeout('getStatus();', 6000); 
       //AJAX CALL TO RUN PROCESS
       $.ajax({
       type: "GET",
       url: "main.php",
       data: 'url=' + validURL + '&filename=' + fileNameTxt,
       success: function(msg){
       //ON SUCCESS CLEAR SETTIMEOUT AND SHOW ELEMENTS (text)
       clearTimeout(continueTime);
       clearTimeout(startTime);    
        $("#loading").hide("slow");
        $("#done").html("Done");   
       }//function

     });//ajax

}//function convertNow

function getStatus(){
        //AJAX CALL TO GET STATUS OF PROCESS
        $.ajax({
        type: "POST",
        url: "fileReader.php",
        data: 'textFile=' + fileNameTxt,
        success: function(respomse){
        textFileResponse = respomse.split(" ");
        $("#done").html("Processing...");
        }
        });//ajax
        clearTimeout(continueTime);

        if(textFileResponse[0]=='100.0%'){
            clearTimeout(continueTime);
        }
        else{
            clearTimeout(startTime);
            continueTime = setTimeout('getStatus();', 3000); 
        }
}
Это было полезно?

Решение

Вероятно, в textFileReponse ошибка синтаксического анализа [0]=='100.0%' в некоторых крайних случаях, когда значение в ответе не равно точно 100.0% (возможно, есть дополнительные пробелы, или, возможно, есть некоторые незначительные различия на некоторых платформах и т.д.).Это привело бы к тому, что код провалился бы в блок else {}, и ваша функция GetStatus снова была бы поставлена в очередь.

Редактировать:Учитывая тему в комментариях, также существует равная вероятность того, что между двумя блоками Ajax-кода происходит гонка.(просто помещаю это здесь для удобства читателей).ОКОНЧАТЕЛЬНАЯ ПРАВКА

Однако, что вы, вероятно, хотите, в дополнение к разрешению синтаксического анализа, так это использовать setInterval() только с одним таймером вместо таймера startTime и continueTime.setTimeout выполняется только один раз, тогда как setInterval повторяется каждые x миллисекунд, так что вам понадобится только одна.Чтобы отменить setInterval, используйте clearInterval.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top