2013-06-26 4 views
0

JavaScript의 setInterval 함수를 사용하여 매초마다 텍스트 파일의 내용으로 텍스트 영역을 HTML 페이지로 업데이트하려고합니다. 그러나 setInterval 호출 내부의 함수는 한 번만 실행되는 것처럼 보입니다.JavaScript setInterval은 한 번만 실행됩니다.

자바 스크립트 :

// 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); 

요청이 텍스트 파일이 오래 결코 간단하기 때문에 비동기 아니며, 이것이 내가 빨리 함께 던져하려고 무언가이다.

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> 

누구나 아이디어를 가지고?

+1

콘솔에 오류가 있습니까? –

+2

제발 하지마. AJAX뿐만 아니라 JavaScript 자체는 이벤트 기반 비동기 언어입니다. 편의를 위해 그것을 우회하려고하지 마십시오. – voithos

+2

왜 동기식 AJAX를하고 있습니까? 그건 차단 및 일반적으로 나쁜 연습, 어떻게 그것을 피하기 위해 [이 답변보기] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call/16825593# 16825593) –

답변

5

브라우저가 캐싱 중이라고 가정합니다. 데이터를 정확히 한 번 가져 오면 다음 요청이 캐시에서 제공됩니다. 따라서 refreshLog을 반복적으로 호출해야합니다. 다음 호출은 캐시에서 제공되는대로 페이지에 아무런 영향을 미치지 않습니다.

URL에 ?=<timestamp>과 같은 고유 한 부분을 추가하십시오.

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

이것은 트릭을 만들었습니다. 주석을 기반으로 비동기 요청으로 변경 될 것이지만 비동기 요청에도이 문제가 있었을 것으로 생각됩니다. 나는 SO가 허락하자마자 대답을 받아 들일 것이다. 감사! – alexgerst

+0

@alexgerst하지만 캐시되지 않은 헤더로 응답을 보내 브라우저가 캐싱되지 않도록 할 수 있습니다. – Paulpro

+4

어느 신이신가요? 적어도 5000 가지가 있습니다. –

관련 문제