在编写脚本时,我注意到我的 ajax 比预期的要多 10 倍,所以我输入了一个“fps 计数器”,并注意到不是像预期的那样每秒运行 10 次,而是每秒运行大约 130 次 ie/ff/歌剧大约每秒 35 帧。使用以下设置:
function load(){
//other code that does not effect this
requestAnimFrame(function(){
load();
});
debug();//function i was using to catch fps
}
window.requestAnimFrame = (function(callback){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback){
window.setTimeout(callback, 100);
};
})();
现在谷歌浏览器似乎并不关心我在 window.setTimeout(callback, 100); 它可能是 1 也可能是 10000000 它以大约 130 帧的速度运行,而其余的似乎足够接近它(总是大约是预期的 3 倍)并且我已经确保我没有多次调用 load()
另一方面,我曾经使用 setTimeout(load, 100); 当我更改为所有浏览器开始以大约 30fps 的速度运行时
function load(){
//other code that does not effect this
debug();//function i was using to catch fps
setTimeout(load, 100);
}
这样做是不好的做法还是过时了?重点是我不太确定为什么我使用 requestAnimFrame,然后我在网上找到的所有示例也都使用它,而且它似乎实现了给定的目标。我一遍又一遍地发射负载的唯一原因是检查并查看是否有任何新信息要下来..
编辑对于那些将来阅读本文的人。通过代码逐行运行后,我发现逻辑错误解释了我的 3x。我确实确保我没有在原地调用 load() ,但是
function connected(result){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
//code that does not matter for this
}else if (xmlhttp.status==404){
alert("epic failure i lost the page");
}
d_time = new Date().getTime();
load();
}
Connect 被 xmlhttp.onreadystatechange=connected 调用;所以它可以多次运行 3 组 load(); 我需要做的是:
function connected(result){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
d_time = new Date().getTime();
load();
}else if (xmlhttp.status==404){
alert("epic failure i lost the page");
}
}
所以施密特和帕特里克都在这里帮忙。施密特让我知道我是一个菜鸟并且做错了。patrick 帮助我准确了解该功能发生了什么