Улучшение долго опрашивающей производительности Ajax

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

5
задан Matt Ball 19 January 2010 в 15:57
поделиться

3 ответа

Также возможно, что это FireBug. Вы используете console.logging, что означает, что у вас, вероятно, открыта вкладка сетевого монитора и т. Д., Что означает, что каждый запрос хранится в памяти.

Попробуйте отключить, посмотрите, поможет ли это.

2
ответ дан 14 December 2019 в 13:36
поделиться

Глубина стека 4-5 является правильным. Settimeate и $. Ajax - асинхронные звонки, которые возвращаются немедленно. Обратный вызов позже вызывается браузером с пустым стеком вызовов. Поскольку вы не можете реализовать длительный опрос синхронным способом, вы должны использовать этот рекурсивный подход. Нет способа сделать это итеративным.

Я подозреваю, что причина этого замедления - это то, что ваш код имеет утечку памяти. Утечка может быть либо в $. Ajax jQuery (очень маловероятно) или в вашем ProcessResults вызов.

1
ответ дан 14 December 2019 в 13:36
поделиться

Я подозреваю, что память протекает из ProcessResults () .

Я использовал очень похожий код для вашего в длительном веб-приложении, который может работать бесперебойным в течение нескольких недель без обновления страницы.

Ваш стек не должен быть глубоким, потому что Fetch () возвращает немедленно. У вас нет бесконечно рекурсивной петли.

Вы можете использовать дополнительный монитор Firefox , чтобы помочь вам в нахождении утечек памяти.

2
ответ дан 14 December 2019 в 13:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: