【问题标题】:jsonp memory leakjsonp内存泄漏
【发布时间】:2010-08-13 01:16:47
【问题描述】:

所以我最近设置了一个 chrome 扩展来刷新页面并调用我编写的 jsonp Web 服务,但存在内存泄漏。我搜索了所有互联网以找到解决方案,但似乎没有任何效果。我使用了指定“jsonp”的普通 jQuery .ajax() 调用,我使用了在http://code.google.com/p/jquery-jsonp/ 找到的 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 }); 然后泄漏就消失了。

【问题讨论】:

  • 你能发布你的代码吗?或者至少是您在代码方面所做工作的总体布局?另外,是 JavaScript 端还是服务器端的内存泄漏?删除不相关的标签。
  • jsonp memory leak的可能重复
  • @Justin Niessner,@joelatdotzilla 要求删除另一个问题,而改用这个问题。
  • 我添加了一个代码sn-p,删除后不再有内存泄漏...
  • 你试过delete returned.d;delete returned吗?如果你这样做了但它没有工作,那么你的回调中的某些东西可能仍然持有对数据/对象的引用。

标签: javascript jquery jsonp webservice-client webservices-client


【解决方案1】:

如果您的代码结构如下:

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;
})();

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-01-20
    • 2011-10-31
    • 2019-08-10
    • 2013-06-24
    相关资源
    最近更新 更多