我有一个程序,使用getJSON从服务器获取JSON并处理此数据并将其呈现给用户。但是服务器上的数据每隔一段时间就会更新一次。如何每5分钟获取一次新的JSON并将其显示给用户并在后台线程中执行?我可以使用setTimeout吗?
谢谢! 马特
答案 0 :(得分: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);
(注意我在那里使用vanilla JS,而不是jQuery,因为我不知道在web worker中使用jQuery的任何方法。你可以导入脚本,但是jQuery引用window
,web worker中的错误是它们与窗口或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分钟叫一个新工人是否有任何好处,或者,就像我一样,每隔5分钟使用一名工人,我不确定。可能不是很多,因为在任何一种情况下都会有间隔。
答案 1 :(得分:0)
是的,您可以使用setTimeout
(或setInterval
,如果您希望它无休止地运行)来提取数据。
我认为这是你更好的选择......