Работает ли этот код JS должным образом? - PullRequest
0 голосов
/ 04 марта 2009

Каждые 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); 
        }
}

1 Ответ

4 голосов
/ 04 марта 2009

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

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

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

...