Я пишу веб-приложение (Совместимый с Firefox только), который использует долго опрос (через ajax способности jQuery) для отправки более или менее постоянных обновлений от сервера до клиента. Я обеспокоен эффектами оставления этого выполнения в течение долгих промежутков времени, скажем, весь день или в течение ночи. Скелет абсолютного кода - это:
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, но я не могу вполне перенести голову вокруг этого, чтобы выяснить, является ли это тем, в чем я нуждаюсь здесь.
Лучшее решение состоит в том, чтобы только сделать твердое обновление на странице периодически, скажем, один раз в час? Существует ли лучший/более минимизированный долго опрашивающий шаблон разработки, который не поместит вред на браузер даже после выполнения в течение 8 или 12 часов? Или я должен просто пропустить долгий опрос в целом и использовать другое "постоянное обновление" шаблон, так как я обычно знаю, как часто сервер будет иметь ответ для меня?
Также возможно, что это FireBug. Вы используете console.logging, что означает, что у вас, вероятно, открыта вкладка сетевого монитора и т. Д., Что означает, что каждый запрос хранится в памяти.
Попробуйте отключить, посмотрите, поможет ли это.
Глубина стека 4-5 является правильным. Settimeate
и $. Ajax
- асинхронные звонки, которые возвращаются немедленно. Обратный вызов позже вызывается браузером с пустым стеком вызовов. Поскольку вы не можете реализовать длительный опрос синхронным способом, вы должны использовать этот рекурсивный подход. Нет способа сделать это итеративным.
Я подозреваю, что причина этого замедления - это то, что ваш код имеет утечку памяти. Утечка может быть либо в $. Ajax
jQuery (очень маловероятно) или в вашем ProcessResults
вызов.
Я подозреваю, что память протекает из ProcessResults ()
.
Я использовал очень похожий код для вашего в длительном веб-приложении, который может работать бесперебойным в течение нескольких недель без обновления страницы.
Ваш стек не должен быть глубоким, потому что Fetch ()
возвращает немедленно. У вас нет бесконечно рекурсивной петли.
Вы можете использовать дополнительный монитор Firefox , чтобы помочь вам в нахождении утечек памяти.