改善长询Ajax性能
-
21-09-2019 - |
题
我正在写一个网络应用程序(Firefox兼容只)其使用长投票(通过google i/o大会的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爬行。我一直在想这可能是部分引起一大堆的深度,因为我已经基本上写一个无限的递归功能。然而,如果我使用萤火并扔了一个断点到 fetch
, 看,它看起来喜欢这个不是这种情况。堆,萤火虫给我看只有大约4或5帧深,甚至在一个小时。
一个解决方案我在考虑是改变我的递归功能的一个迭代,但我想不通我怎么会插入迟延之间的Ajax请求 没有丝.我看了看 JS1.7"产量"的关键词 但是我不能完全理解它,以弄清如果我需要什么在这里。
是最好的解决方案只是为做一个硬盘上的刷新的网页定期,比如说,一旦每小时?是否有更好/更精简长投票的设计图案,不会把一个受伤的浏览器甚至在运行之后,8或者12小时?或者我应该跳过长期投票,共和使用不同的"不断更新"的模式,因为我通常会知道如何频繁的服务器将有一个响应我?
解决方案
这也是可能的,这就是萤火虫.你是控制台。记录的东西,这意味着你可能有一个网络监视项卡开放,等等,这意味着每一个要求是存在的记忆。
尝试禁用它,看看是否有帮助。
其他提示
我怀疑存储器泄漏 processResults()
.
我一直在使用非常类似码你在长询网应用程序,这是能够不间断地运行几个星期没刷新页面。
你堆不应该是深刻的,因为 fetch()
立即返回。你没有无限的递归的循环。
你可能想要使用火狐 泄漏监测加上 来协助你找到记忆泄漏。
堆深度为4-5是正确的。 setTimeout
和 $.ajax
是异步的呼吁,立即返回。回调是后来被称为通过浏览器与空话的堆叠。因为你不能实现长期投票以同步的方式,必须使用这种递归的办法。有没有办法让它迭代的。
我怀疑其原因为这一减慢是你的代码中有一个存储器泄漏。泄漏可能要么是在 $.ajax
通过jQuery(非常不可能的),或在您的 processResults
呼叫。
这是一个坏主意叫 fetch()
从内部方法本身。Recursivity是更好地用来当你的期望,在某一点的方法将会达到一个结束和结果将开始发送的来电。事情是,当你打电话的方法递归,它不断主叫方法的开放和使用的存储器。如果你们只有3-4框深,这是因为jQuery或浏览器以某种方式"固定"你做了什么。
最近的版本备支持长询默认。这样你可以肯定,yhou不deppending上的浏览器就是情报处理与你无限的递归的呼吁。当叫的 $.ajax()
方法可以使用代码下面要做一个很长的调查合并与一个安全的等待的500毫秒之前一个新的呼叫。
function myLongPoll(){
setTimeout(function(){
$.ajax({
type:'POST',
dataType: 'JSON',
url: 'http://my.domain.com/action',
data: {},
cache: false,
success:function(data){
//do something with the result
},
complete: myLongPoll,
async : false,
timeout: 5000
});
//Doesn't matter how long it took the ajax call, 1 milisec or
//5 seconds (timeout), the next call will only happen after 2 seconds
}, 2000);
这样你可以肯定的是的 $.ajax()
通话关闭之前的下一个开始。这可以证明通过加入一个简单的 console.log()
在现有和另一个之后你的 $.ajax()
呼叫。