утечка памяти в jsonp - PullRequest
       28

утечка памяти в jsonp

0 голосов
/ 12 августа 2010

Итак, я недавно установил расширение Chrome для обновления страницы и вызова веб-службы jsonp, которую я написал, но есть утечка памяти.Я искал все в Интернете, чтобы найти решения, и, кажется, ничего не работает.Я использовал простой вызов jQuery .ajax (), указывающий «jsonp», я использовал jquery-jsonp, найденный в http://code.google.com/p/jquery-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 }); тогда утечка исчезнет.

1 Ответ

2 голосов
/ 12 августа 2010

Если ваш код структурирован так:

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) в конечном итоге приводят к объектам, которые среда выполнения должна отслеживать, но которые в основном не используются.

Альтернативой является использование вспомогательной функции вне области действия 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;
})();
...