2

我有一个程序,它使用 getJSON 从服务器获取 JSON 并处理此数据并将其呈现给用户。但是服务器上的数据每隔一段时间就会更新一次。如何每 5 分钟获取一次新的 JSON 并将其显示给用户并在后台线程中执行?我可以为此使用 setTimeout 吗?

谢谢!马特

4

2 回答 2

6

使用每 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 分钟行动一次,我不确定。可能不是很多,因为在任何一种情况下,都会有一个间隔。

于 2012-07-02T10:44:37.290 回答
0

是的,您可以使用setTimeout(或者setInterval如果您希望它无休止地运行)来提取数据。我认为这是你更好的选择...

于 2012-07-02T10:16:08.330 回答