Javascript 如何使用AJAX和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

因此,现在我正在不断地发送xmlhttprequests和GET到一个PHP脚本,该脚本将返回文件夹中的文件量

我用一个
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()
仍将保持轮询。我在这个答案中使用了代码,它工作得非常完美!非常感谢。这两个答案都很有帮助,我从他们身上学到了很多。谢谢