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