使用每 5 分钟触发一次的间隔是显而易见的(也是与浏览器最兼容的)方法。
这不会创建单独的线程,而是这样做的传统模拟。实际发生的所有事情都是异步事件排队,以便在尽可能接近您规定的应该运行的时间点执行。但精度无法保证,因为它在同一个线程上运行,因此在 JS 引擎的执行中需要一个“机会之窗”。
换句话说,JS 引擎将尽力在需要的时刻执行您的代码,但前提是它可以自由执行。
如果您不介意较旧的浏览器支持,您可以使用网络工作者 http://www.html5rocks.com/en/tutorials/workers/basics/,它确实在单独的线程上运行。
网络工作者脚本
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 Workers 中使用 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 分钟执行一次是否有任何好处。可能不会太多,因为无论哪种情况,都会有一个间歇期。