我需要使用 JavaScript 在给定的时间间隔内更新大量数据。问题是,无论我使用什么 JS 库(甚至是裸机 js),所有浏览器似乎都会在每个 AJAX 请求上分配内存,并且之后无法释放它。这是一个应该重现错误的示例片段:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Memleak Test</title>
<meta charset="utf-8" />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript">
function readData() {
$.getJSON('data.php');
}
$(document).ready(function() {
setInterval(readData, 1000);
});
</script>
</head>
<body>
<div id="content"></div>
</body>
</html>
等效的测试页位于jsbin http://jsbin.com/ixeve5/3
以下是更多相关信息:
- 我还尝试将 readData() 函数作为闭包直接放在 setInterval() 调用中。这似乎没有什么区别。
- 我在这里使用 jQuery,但任何其他库都会产生相同的错误。
- 我的 data.php 脚本只是在 PHP 中使用 json_encode() 生成一个假的 JSON 对象。
- 我知道这里一秒是很短的时间范围,在我的制作脚本中时间范围是 30 秒。我只是想更快地看到效果(在生产应用程序中需要几个小时,但内存也已满)。
- 这里的问题是该应用程序将 24/7 开放。
这看起来很简单,我觉得我在这里做的事情真的是错误的,如果这里的一些 JS 专家能帮助我,那就太好了!
只是一个想法,您应该使用 setTimeout 而不是 setInterval ,然后当超时时再次设置超时。
这样,如果您由于某种原因失去了对 setInterval 的跟踪,您就不会面临 setInterval 消失的风险:
- http://weblogs.asp.net/bleroy/archive/2009/05/14/setinterval-is-moderately-evil.aspx http://weblogs.asp.net/bleroy/archive/2009/05/14/setinterval-is-moderately-evil.aspx
我还认为 jquery ajax 有一个成功回调,您可以将其用作设置超时的点。这样,正如本线程其他地方提到的那样,您就不会出现重叠的请求。
- http://api.jquery.com/jQuery.getJSON/ http://api.jquery.com/jQuery.getJSON/
(刚刚检查了一下,有成功回调)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)