0

Так что я недавно установил расширение chrome для обновления страницы и вызвал веб-службу jsonp, которую я написал, но есть утечка памяти. Я искал весь интернет, чтобы найти решения, и ничего не работает. Я использовал простой jQuery .ajax() вызов с указанием «jsonp», я использовал jquery-jsonp, найденный в http://code.google.com/p/jquery-jsonp/, и множество других методов ... Я не могу потерять утечку памяти. Может ли кто-нибудь указать мне пример, который делает то, что я ищу, или указать мне в правильном направлении? Мне просто нужно увидеть, как скрипт постоянно вызывает вызов jsonp, а не утечку памяти.Утечка памяти jsonp

при запуске моего кода нет никаких утечек, пока я не дойду этот код:

$.jsonp({ 
       url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
       success: function (returned, textStatus) { 
        callback({ "d": returned.d, "pickCount": pickCount }); 
       } 
      }); 

если я заменить этот код с: callback({ "d": "1", "pickCount": pickCount }); то утечка идет прочь.

+0

Вы можете оставить свой код? Или, по крайней мере, общий макет того, что вы делаете по коду? Кроме того, утечка памяти на стороне JavaScript или на стороне сервера? Удалите ненужные теги. – strager

+0

Возможный дубликат [утечки памяти jsonp] (http://stackoverflow.com/questions/3464766/jsonp-memory-leak) –

+0

@Justin Niessner, @joelatdotzilla просил удалить другой вопрос, и вместо этого он будет использоваться. – strager

ответ

2

Если код структурирован следующим образом:

function callback() { 
    // (or similar, maybe with `setTimeout`) 

    $.jsonp({ 
    url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
    success: function (returned, textStatus) { 
     callback({ "d": returned.d, "pickCount": pickCount }); 
    } 
    }); 
} 

Тогда новая success функция создается рекурсивно. Стек вызовов может выглядеть следующим образом:

> callback 
    > $.jsonp 
    > NEW success 
     > callback 
     > $.jsonp 
      > NEW success 
      > ... 

растет стек, новые success функции создается на каждой итерации, и весь контекст самих success функций (которая включает в себя returned, textStatus и контекст callback «s) в конечном итоге приводят к объектам, которые среда выполнения должна отслеживать, но в основном не используются.

Альтернативой иметь вспомогательную функцию вне сферы callback:

function callCallback(returned, textStatus) { 
    callback({ "d": returned.d, "pickCount": pickCount }); 
} 

function callback() { 
    // (or similar, maybe with `setTimeout`) 

    $.jsonp({ 
    url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
    success: callCallback 
    }); 
} 

При необходимости, сделать функцию частным. Например:

var callback = (function() { 
    function callCallback(returned, textStatus) { 
    callback({ "d": returned.d, "pickCount": pickCount }); 
    } 

    function callback() { 
    // (or similar, maybe with `setTimeout`) 

    $.jsonp({ 
     url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
     success: callCallback 
    }); 
    } 

    return callback; 
})(); 

 Смежные вопросы

  • Нет связанных вопросов^_^