2012-07-02 5 views
1

getJSON을 사용하여 서버에서 JSON을 가져 와서이 데이터를 처리하고이를 사용자에게 제공하는 프로그램이 있습니다. 그러나 서버의 데이터는 매번 업데이트되고 있습니다. 새 JSON을 5 분마다 얻고이를 사용자에게 표시하고 백그라운드 스레드에서 어떻게 할 수 있습니까? 이 문제에 setTimeout을 사용할 수 있습니까?데몬 Thread in Javascript

감사합니다. Matt

+0

예. 'setTimeout' (또는'setInterval'조차도)이 일을하는 방법입니다. – Matt

답변

4

5 분마다 실행되는 간격을 사용하는 것이 확실하고 (대부분의 브라우저와 호환되는) 접근법입니다.

이것은 별도의 스레드를 만들지 않지만이를 수행하는 전통적인 시뮬레이션입니다. 실제로 일어나는 모든 것은 비동기 이벤트가 대기열에 올려 져 있고, 실행해야하는 시점에 가능한 한 가깝게 한 번에 실행되도록하는 것입니다. 하지만 동일한 스레드에서 실행되므로 Precision은 보장되지 않습니다. 따라서 JS 엔진 실행시 '기회 창'이 필요합니다.

즉, JS 엔진은 필요한 순간에 코드를 실행하기 위해 최선을 다할 수 있지만 자유롭게 사용할 수 있습니다.

이전 브라우저 지원에 대해 신경 쓰지 않는다면 진정한 별도의 스레드에서 실행되는 web worker을 사용할 수 있습니다.

웹 작업자 스크립트

self.addEventListener('message', function(evt) { 
     var gateway = new XMLHttpRequest(); 
     var intie = setInterval(function() { 
     gateway.open("GET",evt.data.load_url,true); 
     gateway.send(); 
     gateway.onreadystatechange = function() { 
      if (gateway.readyState==4 && gateway.status==200) 
       self.postMessage(gateway.responseText); 
     } 
    }, 300000); //every 5 minutes 
}, false); 

(. 내가 웹 노동자 내부에 jQuery를 사용하여 어떤 방법을 알고 아니에요로서 내가 jQuery를, 거기에 바닐라 JS를 사용하지 참고 당신은 스크립트를 가져올 수 있지만, jQuery를 할 수 있습니다 그들은 창이나 DOM)

홈페이지 JS 스크립트에 어떤 관계를 가지고 있지 않는 한 웹 근로자의 오류 참조 window,

var worker = new Worker('worker.js'); 
worker.addEventListener('message', function(evt) { 
    //the loaded JSON data is now held in evt.data 
    alert(evt.data); 
}, false); 
worker.postMessage({load_url: 'json.txt'}); 

새 작업자에게 5 분마다 전화를 걸거나, 한 명의 작업자를 사용하여 5 분마다 작동시키는 데 도움이되는지 여부는 확실하지 않습니다. 아마도 그 이후로는별로 많지 않을 것입니다. 어떤 경우에도 간격이 벌어지고 있기 때문입니다.

0

예, 데이터를 setTimeout (또는 끝없이 실행하려면 setInterval)으로 가져올 수 있습니다. 더 나은 옵션이라고 생각합니다.