Domanda

Ogni 3 secondi faccio una richiesta POST AJAX per ottenere lo stato di un processo. Funziona benissimo.

Quando il processo raggiunge il 100% viene eseguita una funzione di richiamata (indicata di seguito) per aggiungere nuovi elementi alla pagina e quindi annulla il metodo setTimeout che utilizza per ottenere continuamente l'avanzamento ogni 3 secondi. Tuttavia, mi è stato detto dai miei utenti che a volte non si annulla e i nuovi elementi non vengono aggiunti alla pagina e sono stato bloccato per mostrare "100%".

L'ho provato ancora e ancora e non mi si blocca mai. Anche il codice sembra ok, ma le mie abilità JavaScript non sono eccezionali, quindi speravo che qualcuno potesse sottolineare se esiste il potenziale che si verifichi questo problema?

Ho commentato il codice, mi scuso molto. Ho cercato di ridurlo.

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); 
        }
}
È stato utile?

Soluzione

Probabilmente si è verificato un errore di analisi in textFileReponse [0] == '100,0%' in alcuni casi limite, con il valore nella risposta non uguale esattamente al 100,0% (forse c'è spazio bianco extra o forse ci sono alcune piccole differenze su alcune piattaforme, ecc ...). Ciò causerebbe la caduta del codice nel blocco else {} e la funzione getStatus verrebbe nuovamente messa in coda.

EDIT: dato il thread nei commenti, è anche la stessa probabilità che ci sia una condizione di competizione tra i due blocchi di codice Ajax. (basta metterlo qui a beneficio dei lettori). MODIFICA FINE

Ciò che probabilmente si desidera, oltre a risolvere l'analisi, tuttavia, è utilizzare setInterval (), con un solo timer, anziché un timer startTime e continueTime. setTimeout viene eseguito una sola volta, mentre setInterval si ripete ogni x millisecondi, quindi ne avresti bisogno solo uno. Per cancellare un setInterval, usa clearInterval.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top