我正在编写一个Web应用程序(仅兼容Firefox),它使用长轮询(通过jQuery的ajax能力)从服务器向客户端发送更多或更少的常量更新。我担心让它长时间运行,比如一整天或过夜,会产生什么影响。基本的代码框架如下:
function processResults(xml)
{
// do stuff with the xml from the server
}
function fetch()
{
setTimeout(function ()
{
$.ajax({
type: 'GET',
url: 'foo/bar/baz',
dataType: 'xml',
success: function (xml)
{
processResults(xml);
fetch();
},
error: function (xhr, type, exception)
{
if (xhr.status === 0)
{
console.log('XMLHttpRequest cancelled');
}
else
{
console.debug(xhr);
fetch();
}
}
});
}, 500);
}
(半秒钟的“休眠”是为了防止客户端在更新返回到客户端时过快地对服务器进行攻击-通常情况下会这样。)
让它整晚运行后,Firefox 通常会变得很慢。我一直认为这可能部分原因是堆栈深度太大,因为我基本上编写了一个无限递归函数。然而,如果我使用 Firebug 并在 fetch
中设置断点,看起来情况并非如此。即使经过一个小时,Firebug 显示给我的堆栈只有4或5帧。
我正在考虑的解决方案之一是将我的递归函数更改为迭代函数,但我无法弄清楚如何在 Ajax 请求之间插入延迟,而又不会出现“旋转”现象。���已经查看了 JS 1.7 “yield” 关键字,但我无法完全理解它,以确定它是否适用于此处。
最好的解决方案是定期对页面进行强制刷新,例如每小时一次吗?是否有更好/更简洁的长轮询设计模式,即使运行8或12小时也不会对浏览器造成伤害?还是我应该跳过长轮询,改用其他“常量更新”模式,因为我通常知道服务器将以多频繁的方式向我响应?
setTimeout
产生任何不同的效果。 - Matt BallprocessResults()
中的某些合法操作而导致内存泄漏,而我自己的应用程序并没有这样做。所以是的,它可能是你的问题的原因。 - Daniel Vassallo