Утечка памяти в IE7 при использовании вызовов jquery ajax - PullRequest
1 голос
/ 19 февраля 2012

У меня есть веб-приложение, которое каждую секунду выполняет ajax-вызов для обновления состояния страницы, и у меня возникают серьезные проблемы с утечкой памяти при вызовах ajax в IE7 и jQuery (1.7.1).

Чтобы проверитьутечка памяти Я создал тестовую страницу html, и все, что он делает, - это запускает функцию «refreshState» на документе, готовом.

Функция «refreshState» ничего не делает, кроме как с помощью вызова ajax и установки в следующий разфункция будет работать через функцию setTimeOut.

<script type="text/javascript">
    var url = "http://localhost/QuotesService/QuotesService.svc/GetModel";

    function refreshState() {
        $.ajax({
            url: url,
            cache: false,
            dataType: "json",
            success: function (data) {
                //refresh page data(wasn't activated while testing for memory leaks)
                data = null;
            }
        });

        setTimeout(function () { refreshState() }, 1000);
    }

    $(document).ready(function () {
        refreshState();
    });
</script>

Есть ли лучший способ реализовать эту функцию, которая устранит утечки памяти?

Спасибо Ido

Ответы [ 2 ]

0 голосов
/ 19 февраля 2012

Я должен представить, что утечка связана с тем, что вызов AJAX занимает больше 1 с, поэтому каждый вызов суммируется.

Вам ДЕЙСТВИТЕЛЬНО нужно это обновлять каждую секунду?Попробуйте сделать это с интервалом 5 или 10 секунд, а также добавьте время ожидания interval - 1 (пример ниже).Держу пари, что проблема с памятью исчезнет.

Кроме того, я бы добавил обработчик error к вашему AJAX, чтобы вы могли лучше отслеживать любые проблемы с вызовами AJAX.

function refreshState() {
    $.ajax({
        url: url,
        cache: false,
        dataType: "json",
        timeout: 9000, // 9s timeout
        success: function (data) {
            //refresh page data(wasn't activated while testing for memory leaks)
            data = null;
        },
        error: function(xhr, status, error) {
            console.log(status + " : " + error)
        }
    });

    setTimeout(refreshState, 10000); // 10s interval
}
0 голосов
/ 19 февраля 2012

Если в этом нет особой необходимости, он точен каждую секунду, возможно, это помогает поместить setTimeout в функцию успеха jQuery. Таким образом, вы избежите слишком большого количества вызовов Ajax одновременно на случай, если один из них «заклинит». Если вы решите пойти с этим, я бы также рекомендовал добавить функцию ошибки, которая также устанавливает время ожидания. Таким образом, ошибка не нарушит цикл и сможет "перезагрузить себя".

...