现在我正在不断地将带有GET的xmlhttprequests发送到一个PHP脚本,该脚本会回复文件夹中的文件数量。
我用setInterval()
重复了javascript函数,它工作得非常好,但我希望setInteral()
在我从PHP脚本中返回一定数字后立即停止。
这是我的代码:
<script>
function checkmedia(url,format) {
var format1 = format;
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
progress = this.responseText;
document.getElementById("progress").innerHTML =
this.responseText;
}
};
xhttp.open("GET", 'checkfilecount.php?userurl='+url+'&act=run&format-option=' + format, true);
xhttp.send();
if(progress != "100") {
var media_progress = setInterval(checkmedia.bind(null,url,format1), 10000);
}
}
</script>
因为我连续多次调用这个XMLHttpRequest(对于一个表)我得到了内存泄漏。
欢迎任何形式的帮助。感谢。
答案 0 :(得分:2)
setInterval()
函数以指定的间隔重复调用函数。 setTimeout()
函数在指定的延迟后调用一次函数。你用错了......
你正在收到内存泄漏,因为你正在调用里面的<{1}}函数,所以每次运行它会产生一个额外的间隔,然后产生自己的间隔,等等你无法清除间隔。
您可以从该功能外部致电setInterval()
,然后修改您的setInterval()
以决定是否致电if
以停止整件事(Blaze Sahlzen's answer显示如何执行此操作整洁地说,但我认为只使用clearInterval()
更简单:
setTimeout()
您需要添加一些代码来处理Ajax错误,但我会将其作为读者的练习。
答案 1 :(得分:2)
以下是解决这种情况的一种方法:
function check(url, format) {
function checkmedia(url, format) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("progress").innerHTML = this.responseText;
if (Number(this.responseText) === 100) {
clearInterval(media_progress);
}
}
};
xhttp.open("GET", 'checkfilecount.php?userurl=' + url + '&act=run&format-option=' + format, true);
xhttp.send();
}
var media_progress = setInterval(checkmedia.bind(null, url, format), 10000);
}
check('your_url', 'your_format');
使用clearInterval
,您可以在达到特定条件时停止setInterval
功能。