我正在編寫一個webapp(僅與Firefox兼容),它使用長輪詢(通過jQuery的ajax功能)從服務器向客戶端發送或多或少不斷的更新。我擔心整天或整夜都會長時間運行的影響。基本的代碼框架是這樣的:提高長輪詢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" keyword,但我無法把頭繞在它周圍,弄清楚這是否是我需要的。
最好的解決方案是定期進行一次硬刷新,比如說每小時一次?是否有更好的/更精簡的長輪詢設計模式,即使在運行8或12小時後也不會對瀏覽器造成傷害?或者我應該完全跳過長輪詢,並使用不同的「常量更新」模式,因爲我通常知道服務器對我有多頻繁響應?
這對我有幫助! – JulienFr 2013-07-11 14:13:25