Javascript中的守护线程
我有一个程序,它使用getJSON从服务器获取JSON并处理这些数据,然后将其呈现给用户。但是服务器上的数据每隔一段时间就会更新一次。如何每5分钟获取一次新的JSON,并将其显示给用户,然后在后台线程中执行?我可以使用setTimeout吗 谢谢!Javascript中的守护线程,javascript,daemon,getjson,Javascript,Daemon,Getjson,我有一个程序,它使用getJSON从服务器获取JSON并处理这些数据,然后将其呈现给用户。但是服务器上的数据每隔一段时间就会更新一次。如何每5分钟获取一次新的JSON,并将其显示给用户,然后在后台线程中执行?我可以使用setTimeout吗 谢谢! Matt是的,您可以使用setTimeout(或者setInterval,如果您希望它无休止地运行的话)提取数据。 我认为这是更好的选择…使用每5分钟触发一次的间隔是显而易见的(也是最兼容浏览器的)方法 这不会创建单独的线程,而是传统的模拟方式。实际
Matt是的,您可以使用
setTimeout
(或者setInterval
,如果您希望它无休止地运行的话)提取数据。
我认为这是更好的选择…使用每5分钟触发一次的间隔是显而易见的(也是最兼容浏览器的)方法 这不会创建单独的线程,而是传统的模拟方式。实际发生的只是异步事件排队,在尽可能接近您规定它应该运行的时间点执行。但是,精度不能保证,因为它运行在同一个线程上,所以它需要在JS引擎的执行中有一个“机会窗口” 换句话说,JS引擎将尽最大努力在所需时刻执行您的代码,但前提是它可以自由执行 如果您不介意旧的浏览器支持,您可以使用一个真正在单独线程上运行的 网络工作者脚本
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);
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'});
(注意,我在那里使用的是vanilla JS,而不是jQuery,因为我不知道在web workers中使用jQuery的任何方法。您可以导入脚本,但jQuery引用了窗口
,这在web workers中是错误的,因为它们与窗口或DOM没有任何关联)
主JS脚本
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);
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分钟行动一次,是否有任何好处,我不确定。可能不会太多,因为在这两种情况下,都有一段时间间隔。是的setTimeout
(甚至setInterval
)就是这样做的方法。