Работает ли этот JS-код так, как ожидалось?
-
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.