2013-06-26 3 views
0

Je tente d'avoir une page HTML mettant à jour une zone de texte avec le contenu d'un fichier texte toutes les secondes, en utilisant la fonction setInterval de JavaScript. Cependant, la fonction à l'intérieur de l'appel setInterval ne semble fonctionner qu'une seule fois.JavaScript setInterval ne s'exécute qu'une seule fois

Javascript:

// Send a GET request to the given location 
function sendRequest(location, nonblocking) { 
    var xmlhttp = new XMLHttpRequest(); 
    xmlhttp.open("GET", location, nonblocking); 
    xmlhttp.send(); 
    return xmlhttp.responseText; 
} 

// Refresh the communication log 
function refreshLog() { 
    document.getElementById("comm_log").value = sendRequest("src/log.txt", false); 
} 

window.setInterval(refreshLog, 1000); 

La demande n'est pas asynchrone simplement parce que le fichier texte ne sera jamais long, ce qui est quelque chose que je suis en train de jeter ensemble rapidement.

HTML:

<html> 
<head> 
<style type="text/css"> 
textarea { 
    width: 98%; 
    height: 80%; 
    resize: none; 
    font-family: "Courier New"; 
} 
</style> 

<script type="text/javascript" src="src/script.js"></script> 

</head> 

... 

<textarea id="comm_log" readonly></textarea> 

... 

</html> 

Quelqu'un a des idées?

+1

Une erreur s'est-elle produite dans votre console? –

+2

S'il vous plaît ne pas le faire. Non seulement AJAX, JavaScript lui-même est un langage asynchrone basé sur les événements. N'essayez pas de l'éviter pour plus de commodité. – voithos

+2

Pourquoi faites-vous synax AJAX? C'est le blocage et la pratique généralement mauvaise, sur la façon de l'éviter voir [cette réponse] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call/16825593# 16825593) –

Répondre

5

Je suppose que votre navigateur est en cache. Vous obtenez les données une seule fois, puis les prochaines requêtes sont traitées depuis le cache. Donc, le refreshLog devrait être appelé à plusieurs reprises, juste les appels suivants n'auront aucun effet sur la page car il sert à partir du cache.

Ajoutez à l'URL une partie unique comme ?=<timestamp>.

xmlhttp.open("GET", location + '?=' + new Date().getTime(), nonblocking); 
+0

Cela a fait l'affaire. Je vais passer à une demande asynchrone basée sur les commentaires, mais je suppose que j'aurais eu ce problème avec une demande asynchrone également. J'accepterai la réponse dès que SO me le permettra. Merci! – alexgerst

+0

@alexgerst Vous le feriez, mais vous pouvez empêcher la mise en cache du navigateur en renvoyant votre réponse avec des en-têtes sans cache. – Paulpro

+4

Quel dieu? Il y en a au moins 5000 différentes. –

Questions connexes