Question

Toutes les 3 secondes, je fais une demande AJAX POST pour obtenir le statut d'un processus. Cela fonctionne très bien.

Lorsque le processus atteint 100%, une fonction de rappel s’exécute (voir ci-dessous) pour ajouter de nouveaux éléments à la page, puis annule la méthode setTimeout utilisée pour obtenir la progression en continu toutes les 3 secondes. Cependant, mes utilisateurs m'ont dit que parfois, il ne parvient pas à annuler et que les nouveaux éléments ne sont pas ajoutés à la page, ce qui m'empêche de rester "100%".

J'ai testé cela encore et encore et il ne me coince jamais. Le code a également l’air bon, mais mes compétences en JavaScript ne sont pas excellentes, donc j’espérais que quelqu'un pourrait signaler si ce problème risque de se produire?

J'ai commenté le code, toutes mes excuses, excusez-le. J'ai essayé de le réduire.

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); 
        }
}
Était-ce utile?

La solution

Il y a probablement une erreur d'analyse dans textFileReponse [0] == '100.0%' dans certains cas, la valeur de la réponse ne correspondant pas exactement à 100.0% (peut-être qu'il y a des espaces supplémentaires, ou peut-être quelques différences mineures certaines plates-formes, etc ...). Cela ferait tomber le code dans le bloc else {} et votre fonction getStatus serait à nouveau mise en file d'attente.

EDIT: Etant donné le fil conducteur dans les commentaires, il est également probable qu’une condition de concurrence critique se produise entre les deux blocs de code Ajax. (en plaçant ceci ici pour le bénéfice des lecteurs). END EDIT

Ce que vous voulez probablement, en plus de la résolution de l'analyse, consiste à utiliser setInterval (), avec un seul minuteur, au lieu d'un minuteur startTime et continueTime. setTimeout ne s'exécute qu'une seule fois, alors que setInterval se répète toutes les x millisecondes. Vous n'avez donc besoin que d'une seule. Pour annuler un setInterval, utilisez clearInterval.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top