Javascript 如何使用AJAX和PHP连续检查文件夹中的文件数
因此,现在我正在不断地发送xmlhttprequests和GET到一个PHP脚本,该脚本将返回文件夹中的文件量 我用一个Javascript 如何使用AJAX和PHP连续检查文件夹中的文件数,javascript,php,ajax,memory-leaks,Javascript,Php,Ajax,Memory Leaks,因此,现在我正在不断地发送xmlhttprequests和GET到一个PHP脚本,该脚本将返回文件夹中的文件量 我用一个setInterval()重复了javascript函数,它工作得非常好,但我希望从PHP脚本中返回某个数字后,setInteral()立即停止 这是我的密码: <script> function checkmedia(url,format) { var format1 = format; var xhttp = new
setInterval()
重复了javascript函数,它工作得非常好,但我希望从PHP脚本中返回某个数字后,setInteral()
立即停止
这是我的密码:
<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>
功能检查媒体(url、格式){
var format1=格式;
var xhttp=newXMLHttpRequest();
xhttp.onreadystatechange=函数(){
if(this.readyState==4&&this.status==200){
进度=this.responseText;
document.getElementById(“progress”).innerHTML=
这个.responseText;
}
};
open(“GET“,”checkfilecount.php?userurl='+url+'&act=run&format option='+format,true);
xhttp.send();
如果(进度!=“100”){
var media_progress=setInterval(checkmedia.bind(null,url,format1),10000);
}
}
当我连续多次调用这个XMLHttpRequest时(对于一个表),我得到了一个内存泄漏
欢迎任何形式的帮助。谢谢。函数以指定的间隔重复调用函数。setTimeout()
函数在指定的延迟后调用函数一次。你用错了
由于从函数内部调用setInterval()
,因此会出现内存泄漏,因此每次它运行时都会产生一个额外的间隔,然后这些间隔会产生它们自己的间隔,以此类推,而您在任何地方都无法清除该间隔
您可以从函数外部调用setInterval()
,然后修改if
来决定是否调用clearInterval()
来停止整个过程(显示了如何巧妙地完成),但我认为只使用setTimeout()
要简单得多:
function checkmedia(url, format) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
progress = this.responseText;
document.getElementById("progress").innerHTML = this.responseText;
if (progress != "100") {
setTimeout(checkmedia.bind(null, url, format), 10000);
}
}
};
xhttp.open("GET", 'checkfilecount.php?userurl=' + url + '&act=run&format-option=' + format, true);
xhttp.send();
}
您可能想添加一些代码来处理Ajax错误,但我将把它作为练习留给读者。函数以指定的间隔重复调用函数。setTimeout()
函数在指定的延迟后调用函数一次。你用错了
由于从函数内部调用setInterval()
,因此会出现内存泄漏,因此每次它运行时都会产生一个额外的间隔,然后这些间隔会产生它们自己的间隔,以此类推,而您在任何地方都无法清除该间隔
您可以从函数外部调用setInterval()
,然后修改if
来决定是否调用clearInterval()
来停止整个过程(显示了如何巧妙地完成),但我认为只使用setTimeout()
要简单得多:
function checkmedia(url, format) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
progress = this.responseText;
document.getElementById("progress").innerHTML = this.responseText;
if (progress != "100") {
setTimeout(checkmedia.bind(null, url, format), 10000);
}
}
};
xhttp.open("GET", 'checkfilecount.php?userurl=' + url + '&act=run&format-option=' + format, true);
xhttp.send();
}
您可能想添加一些代码来处理Ajax错误,但我将把它作为练习留给读者。以下是一种处理这种情况的方法:
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
功能。以下是处理这种情况的一种方法:
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
功能。干得好。你让我不用在我自己的答案中写这个技巧,我只是链接到了你的答案。谢谢!但你还是比我先找到了答案:好吧。如果我花时间提前编写这两个版本,你可能会是第一个,但我认为setTimeout()
版本更容易,所以我就这么做了。干得好。你让我不用在我自己的答案中写这个技巧,我只是链接到了你的答案。谢谢!但你还是比我先找到了答案:好吧。如果我花时间提前编写这两个变体,您可能会是第一个,但我认为setTimeout()
版本更容易,所以我选择了这个版本。我认为这是一个更好的方法,因为setInterval
不会等待前一个实例完成处理,如果它花费的时间太长,我们可能有多个实例在运行,导致内存再次泄漏。这是一种可能的情况吗?@BlazeSahlzen-很明显,setTimeout()
版本保证一次最多只能调用一个ajax,所以我想这更安全,尽管我刚刚意识到我过于简化了一点,因为我本应该把if
放在onreadstatechange
处理程序中(我现在就这么做),而且我应该考虑到ajax错误(我不想费心这么做)。即使出现错误,至少setInterval()
仍将保持轮询。我在这个答案中使用了代码,它工作得非常完美!非常感谢。这两个答案都很有帮助,我从他们身上学到了很多。Thanks我认为这是一种更好的方法,因为如果花费太长时间,setInterval
不会等待前一个实例完成处理,而且可能会有多个实例运行,再次导致内存泄漏。这是一种可能的情况吗?@BlazeSahlzen-很明显,setTimeout()
版本保证一次最多只能调用一个ajax,所以我想这更安全,尽管我刚刚意识到我过于简化了一点,因为我本应该把if
放在onreadstatechange
处理程序中(我现在就这么做),而且我应该考虑到ajax错误(我不想费心这么做)。即使出现错误,至少setInterval()
仍将保持轮询。我在这个答案中使用了代码,它工作得非常完美!非常感谢。这两个答案都很有帮助,我从他们身上学到了很多。谢谢