Vis*_*hnu 5 javascript ajax memory-leaks
我怎样才能避免XHR POST内存泄漏?我浏览了很多关于XHR内存泄漏的网页,但是没有好的解决方案.我的问题几乎与此类似.该 博客解释了问题,但没有解决方案.
我的问题:我有一个连续向服务器发送日期的Web应用程序(2Mb到80Mb),它将发出10到300个请求.这是POST请求.对于GET请求没有像这样的大问题.
我怎么解决这个问题?循环参考,范围,更接近等我尝试但没有成功.我尝试使用delete关键字进行readystate更改,删除以前的xhr对象,尝试重用xhr,xhr引用null,更改编码模式等
这是示例代码.这是我需要的功能
var base_string = "ABCDEFGHIJKLMNOPQUST01234567890!@#$%^&:ABCDEFGHIJKLMNOPQUST01234567890!@#$%^&ABCDEFGHIJKLMNOPQUST01234567890!@#$%^&";
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
base_string += base_string;
this.sampleData = base_string;
var dataToSend = this.sampleData.substring( 0, 2000000 );
this.xhr = [];
this.xhr[0] = new XMLHttpRequest();
function sendRequest (){
var Self = this;
Self.xhr[0].onload = function (test) {
sendRequest ();
};
Self.xhr[0].open("POST", "http://localhost/upload.php" + "?n=" + Math.random(), true);
Self.xhr[0].send(dataToSend);
}
sendRequest ();
Run Code Online (Sandbox Code Playgroud)
如何在没有内存泄漏的情况下实现此目的?
对于您发送的每个请求,您都添加一个新的 onload 处理程序。
Self.xhr[0].onload = function (test) {
sendRequest ();
};
Run Code Online (Sandbox Code Playgroud)
旧的处理程序此时不会被删除并保留在内存中。垃圾收集器将无法释放内存。
在您的情况下,您只需要一个事件侦听器,因此我建议像这样将侦听器的附件移出 sendRequest 函数,并且内存泄漏应该消失。
this.xhr = [];
this.xhr[0] = new XMLHttpRequest();
xhr[0].onload = function (test) {
sendRequest ();
};
function sendRequest (){
xhr[0].open("POST", "http://localhost/upload.php" + "?n=" + Math.random(), true);
xhr[0].send(dataToSend);
}
sendRequest ();
Run Code Online (Sandbox Code Playgroud)
我尝试了另一个版本,它产生了更好的结果。在我的设置中内存从未超过 2.6G。它是 Jaromandas 作品的衍生作品。这基本上是他的版本,添加了removeEventHandler和delete
function sendRequest (){
function run(e){
xhr.upload.removeEventListener('load',run)
sendRequest()
}
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('load', run);
xhr.open("POST", "http://localhost:2345/" + "?n=" + Math.random(), true);
xhr.send(dataToSend);
delete xhr
}
sendRequest ();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2104 次 |
| 最近记录: |