Pregunta

Cada 3 segundos hago una solicitud AJAX POST para obtener el estado de un proceso. Esto funciona muy bien.

Cuando el proceso alcanza el 100%, se ejecuta una función de devolución de llamada (indicada a continuación) para agregar nuevos elementos a la página y luego cancela el método setTimeout que se usa para obtener el progreso continuamente cada 3 segundos. Sin embargo, mis usuarios me han dicho que a veces no se cancela y que los nuevos elementos no se agregan a la página y que se han atascado al mostrar " 100% "

He probado esto una y otra vez y nunca se atasca. El código también se ve bien, pero mis habilidades con JavaScript no son excelentes, así que esperaba que alguien pudiera señalar si existe algún problema potencial.

He comentado el código, disculpas, es muy largo. He intentado reducirlo.

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

Solución

Probablemente hay un error de análisis en la respuesta de archivo de texto [0] == '100.0%' en algunos casos de borde, con un valor en la respuesta que no es exactamente igual al 100.0% (tal vez haya un espacio en blanco adicional, o tal vez haya algunas diferencias menores en Algunas plataformas, etc ...). Esto haría que el código cayera al bloque else {}, y su función getStatus se pondría en cola nuevamente.

EDITAR: Dado el hilo de los comentarios, también es probable que exista una condición de carrera entre los dos bloques del código Ajax. (solo poner esto aquí para el beneficio de los lectores). EDICIÓN FINAL

Sin embargo, lo que probablemente desee, además de resolver el análisis, es usar setInterval (), con un solo temporizador, en lugar de un tiempo de inicio y de continuación. setTimeout se ejecuta solo una vez, mientras que setInterval se repite cada x milisegundos, por lo que solo se necesita uno. Para cancelar un setInterval, use clearInterval.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top