Я пишу веб-приложение ( только для 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 часов работы? Или я должен просто вообще пропустить длинный опрос и использовать другой шаблон «постоянного обновления», поскольку я обычно знаю, как часто сервер будет получать ответ для меня?