Faz este trabalho Código JS como esperado?
-
03-07-2019 - |
Pergunta
A cada 3 segundos eu fazer uma solicitação AJAX POST para obter o status de um processo. Isso funciona muito bem.
Quando o processo chega a 100% uma chamada de volta Executa a função (indicados abaixo) para adicionar novos elementos para a página e, em seguida, ele cancela o método setTimeout que o uso para continuamente obter o progresso a cada 3 segundos. No entanto, foi-me dito pelos meus usuários às vezes não consegue cancelar e os novos elementos não são adicionados à página e eu fui que ficam presos em mostrar "100%".
Eu testei isso uma e outra vez e nunca fica preso para mim. O código também parece ok, mas minhas habilidades de JavaScript não são grandes, então eu estava esperando que alguém poderia apontar se existir a possibilidade de que isso aconteça problema?
Eu comentou o código, desculpas a sua muito tempo. Tentei reduzi-lo.
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);
}
}
Solução
Há provavelmente um erro de análise na textFileReponse [0] == '100,0%', em alguns casos extremos, com o valor na resposta não igualando exatamente 100,0% (talvez haja espaço em branco extra, ou talvez existam algumas pequenas diferenças no algumas plataformas, etc ...). Isso faria com que o código para cair para o bloco else {}, e sua função getStatus estaria na fila novamente.
EDIT: Dada a fio nos comentários, é também uma probabilidade igual de que há uma condição de corrida acontecendo entre os dois blocos de código Ajax. (Basta colocar isso aqui para o benefício dos leitores). END EDIT
O que você provavelmente vai querer, além de resolver a análise, no entanto, é usar setInterval (), com apenas um temporizador, em vez de um temporizador startTime e continueTime. setTimeout executa apenas uma vez, enquanto setInterval repete a cada x milissegundos, então você precisa de apenas um. Para cancelar um setInterval, use clearInterval.