如何使用AJAX和PHP持续检查文件夹中有多少文件

时间:2017-02-17 05:23:09

标签: javascript php ajax memory-leaks

现在我正在不断地将带有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(对于一个表)我得到了内存泄漏。

欢迎任何形式的帮助。感谢。

2 个答案:

答案 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功能。