我需要在高度动态的Web应用程序中执行jsonp长轮询,但是我遇到了大量的内存泄漏。最初我使用Socket.IO和jsonp传输具有相同的结果,然后设置JQuery测试页面以查看问题是否仅在socket.io lib中本地化。 我发现令人惊讶的是,从JQuery进行jsonp轮询也会产生相同的结果:在IE9中,内存从80-90 MB增加到超过1.8 GB,速度非常快(不到10分钟):(。
他是客户端的测试代码:
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">
<script type="text/javascript">
$(document).ready( function() {
var doPoll = function() {
$.ajax({
type: 'GET',
url: "http://<server-url>/jquery-jsonp/server.php",
cache: false,
async: true,
crossDomain: true,
dataType: "jsonp",
success: function (data, status) {
console.log("Received response"+data);
doPoll();
},
error: function (xhr, textStatus, errorThrown) {
// access denied
}
});
}
doPoll();
});
</script>
</head>
这是虚拟服务器响应:
<?php echo $_GET['callback']."(".json_encode(array("status"=>"success")).")";
你在这里看不到什么特别的东西。有关导致此问题和可能的解决方法的任何想法?
请求需要跨源执行,我们必须支持IE8 / 9。 非常感谢你。
答案 0 :(得分:1)
尝试以几秒钟的间隔调用doPoll()
,如下所示:
success: function (data, status) {
console.log("Received response"+data);
setTimeout(doPoll, 10000); // 10 second wait before next request sent
},
答案 1 :(得分:0)
您收到回复的那一刻就不需要轮询。与常规计算机操作相比,HTTP传输可能较慢,但它们通常比人类反应快一点。延迟至少几秒钟是一个好主意。
那说应该注意到HTTP轮询充其量是不可靠的。以HTML Facebook聊天为例,说明它的不可靠程度。
修改强>
伙计们,感谢您的回复。延迟下一个请求不是 此应用的选项
然后你不应该使用网页。写一个桌面或移动应用程序。如果您的回答是“那也不是一个选择。”那么就没有可行的选择。 HTTP / HTML / Javascript只是不旨在“每秒向用户提供高度动态,关键的业务更新”,我怀疑它会不会。
答案 2 :(得分:0)
所有建议都是有效的,即使你需要每半秒轮询一次服务器,你应该添加几毫秒的超时时间来给javascript一个小暂停,这样它就可以开始清理内存。
另一个问题是JSONP,因为这将在DOM中创建带有响应的新标记。您应该开始删除未使用的节点,否则页面大小将无限增长并最终耗尽内存。