JQuery 1.7.1 Ajax и утечка памяти - PullRequest
1 голос
/ 23 ноября 2011

У меня уже были некоторые проблемы, когда я использовал jQuery 1.4.2 (http://stackoverflow.com/questions/8158739/ie-memory-leak-and-eval-with-jquery/8176724#8176724)

Теперь я обновил свой jQuery до версии 1.7.1, и у меня память медленно увеличивается после каждой итерации.

Это код, который у меня есть:

var interval;
function setupdaterate(rate) {
    //if the interval wasn't defined only
    if (interval == undefined) {
        interval = setInterval(updateitems, rate * 1000);
    }
}

function updateitems() {

        $('.updatable').each(function () {
            var data = 'ViewObjectId=' + $(this).attr('objectid');

            $.ajax({
                async: true,
                url: '/Ajax/GetUpdatedViewObjectDataHandler.ashx',
                data: data,
                type: 'POST',
                timeout: 10000
            }).done(function (data) {
                //do the job

            });

          });

}

Через 10 секунд все элементы с классом «обновляемый» обновляются. Но по какой-то причине этот код теряет память.

Это лучший способ использования jquery ajax? Что может быть причиной утечки памяти?

Как я могу понять, в чем проблема? Любой совет?

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Невозможно определить, почему это происходит, поскольку нет скриншотов кучи и нет кода для обратного вызова done, но избавиться от всех случайных замыканий, которые происходят в хотя бы минимизировать использование памяти. Ниже предполагается, что он запускается внутри глобальной области видимости / в противном случае пустая функция:

var interval;
function setupdaterate(rate) {
    //if the interval wasn't defined only
    if (interval == undefined) {
    interval = setInterval(updateitems, rate * 1000);
    }
}

function updateDone( data ){
    //do the job
}

function iterator() {
    var data = 'ViewObjectId=' + $(this).attr('objectid');

    $.ajax({
        async: true,
        url: '/Ajax/GetUpdatedViewObjectDataHandler.ashx',
        data: data,
        type: 'POST',
        timeout: 10000
        }).done( updateDone
    );
}

function updateitems() {

    $('.updatable').each( iterator );

}
0 голосов
/ 24 ноября 2011

Esailija,

Я попробовал ваш код, и он работал и использовал ту же память, что и моя. Сегодня я заметил кое-что, вчера я тестировал с открытыми инструментами разработки IE8 , я почти уверен, что это было причиной утечки памяти. Потому что сегодня я тестирую с этим закрытым и использование памяти довольно стабильно.

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

...