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); 
        }
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top