2012-07-02 5 views
1

У меня есть программа, которая получает JSON с сервера с помощью getJSON и обрабатывает эти данные и представляет их пользователю. Но данные на сервере обновляются так часто. Как я могу получить новый JSON каждые 5 минут и отобразить его пользователю и сделать это в фоновом потоке? Могу ли я использовать setTimeout для этого?Daemon Thread in Javascript

Спасибо! Мэтт

+0

Да. 'setTimeout' (или даже' setInterval') - это способ сделать это. – Matt

ответ

4

Использование интервала, который срабатывает каждые 5 минут, является очевидным (и наиболее совместимым с браузером).

Это не создает отдельный поток, а является традиционной симуляцией этого. Все, что на самом деле происходит, - это асинхронное событие, поставленное в очередь, которое должно выполняться как можно ближе к тому моменту, когда вы должны его запустить. Однако точность не гарантируется, потому что она работает в одном потоке, поэтому для запуска 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); 

(Примечание я использую ваниль JS там, не JQuery, так как я не знаю ни одного способа использования JQuery внутри веб-рабочих. Вы можете импортировать сценарии, но JQuery ссылки window, какие ошибки в веб-работников, поскольку они не имеют никаких связей с окном или DOM)

Главная JS скрипт

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 минут или, как я, используя одного работника и каждые пять минут, я не уверен. Вероятно, это не так много, поскольку в любом случае происходит интервал.

0

Да, вы можете вытащить данные с помощью setTimeout (или setInterval, если вы хотите, чтобы он бежал бесконечно). Я думаю, что это ваш лучший вариант ...