2009-03-04 7 views
-1

Toutes les 3 secondes, je fais une requête AJAX POST pour obtenir l'état d'un processus. Cela fonctionne très bien. Lorsque le processus atteint 100%, une fonction de rappel s'exécute (indiquée 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 qu'il n'arrive parfois pas à annuler et que les nouveaux éléments ne sont pas ajoutés à la page et je suis resté bloqué pour montrer "100%".Est-ce que ce code JS fonctionne comme prévu?

Je l'ai testé encore et encore et il ne reste jamais bloqué pour moi. Le code semble également correct, mais mes compétences en JavaScript ne sont pas géniales, alors j'espérais que quelqu'un pourrait signaler s'il y a un potentiel de ce problème qui se passe?

J'ai commenté le code, excuse son très long. 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); 
     } 
} 
+1

"Est-ce que ce code JS fonctionne comme prévu?" - Je suppose que ça dépend de ce que tu espérais. – EBGreen

+0

Cela fonctionne parfaitement pour moi à chaque fois. C'est juste qu'un ou deux utilisateurs ont dit qu'il est bloqué à "100%" et qu'il ne montre pas les éléments "Terminé". – Abs

Répondre

4

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

EDIT: Étant donné le fil dans les commentaires, il est également probable qu'il existe une condition de concurrence entre les deux blocs de code Ajax. (juste mettre ceci ici pour le bénéfice des lecteurs). END EDIT

En plus de résoudre l'analyse, vous devez toutefois utiliser setInterval(), avec un seul timer, au lieu d'un timer startTime et continueTime. setTimeout s'exécute une seule fois, alors que setInterval se répète toutes les x millisecondes, donc vous n'en aurez besoin que d'une seule. Pour annuler setInterval, utilisez clearInterval.

+0

Si cela se passe dans le bloc else {} et que le processus est terminé, alors la fonction de réussite du processus devrait clearTimeout (continueTime) et clearTimeout (startTime), non ?! – Abs

+0

Pas nécessairement ... getStatus() et success() s'exécutent de manière asynchrone, vous pourriez donc vous retrouver avec une condition de concurrence. Étant donné que vous avez la vérification de succès, vous pouvez vous débarrasser de la vérification de chaîne dans getStatus(). En utilisant getInterval() seul la zone de succès peut annuler l'intervalle sans vérifier le texte –

+0

Cela permettrait également de clarifier la condition de concurrence, en supposant que c'est le problème –

Questions connexes