我有一个PHP web应用程序,它使用jquery/AAJAX来轮询数据库信息。
基本上,我有一个到5000ms的setInterval,它向PHP页面发布$.post,该页面通常接收大量数据(大约3.5kb到10kb)。我发现几个小时后,网络浏览器就停止了。
所有数据都加载到一个div(一个表)中。在每个请求中,我清空()表并附加新表。我能做些什么来防止它滞后于浏览器?
一些代码,如果它有帮助:
function getData(val ){
$.post('php/data.php', {
func: 'getdata', val : val
}, function (data) {
if (data) {
$('#results').empty();
$.each(data, function (i, e) {
if (i == "something") {
$('#results').append(data.someStuff).......
}
});
}
}, "json");
}
// On immediate page load
getData(val);
var getData_interval = setInterval(getData.bind(this, val),5000);
由于您还没有发布任何其他代码,我将尽力帮助您解决我所看到的问题。我建议每次$.post
方法实际成功时都使用setTimeout
,而不是以固定的5秒间隔使用setInterval
(这不依赖于其余的调用)。使用固定间隔会产生意想不到的结果,因为你永远无法知道响应的长度(例如,如果连接中断会发生什么?)
function getData(val ){
$.post('php/data.php', {
func: 'getdata', val : val
}, function (data) {
if (data) {
$('#results').empty();
$.each(data, function (i, e) {
if (i == "something") {
$('#results').append(data.someStuff).......
}
});
//this will only perform the next ajax call on success
setTimeout(function() {getData(val)},5000);
}
}, "json");
}
// On immediate page load
getData(val);
希望这能有所帮助!
使用setInterval而不是递归setTimeout时可能会出现许多问题。无论天气如何,SetInterval都将运行,无论回调函数是否成功执行,这意味着随着时间的推移,您可能会挂起浏览器。
尝试更改:
getData(val ){
$.post('php/data.php', {
func: 'getdata', val : val
}, function (data) {
if (data) {
$('#results').empty();
$.each(data, function (i, e) {
if (i == "something") {
$('#results').append(data.someStuff).......
}
});
}
}, "json");
}
var getData_interval = setInterval(getData.bind(val),5000);
到此:
var myIntervalTime = null;
function getData(val ){
$.post('php/data.php', {
func: 'getdata', val : val
}, function (data) {
if (data) {
$('#results').empty();
$.each(data, function (i, e) {
if (i == "something") {
$('#results').append(data.someStuff).......
}
});
}
getData_interval();
}, "json");
}
function getData_interval() {
myIntervalTimer = setTimeout(function() {
getData.bind(val);
}, 5000);
}
function clearGetData_interval() {
window.clearTimeout(myIntervalTimer);
}
function resetGetData_interval() {
clearGetData_interval();
getData_interval();
}
这将确保您的ajax调用只在最后一个调用完成后5秒运行。
此外,请阅读javascript计时器的工作原理:http://ejohn.org/blog/how-javascript-timers-work/