2017-02-17 2 views
1

Так что сейчас я продолжительные отправками XMLHttpRequests с GET на PHP скрипт, который дает мне обратно количество файлов в папке.Как продолжительную проверить, сколько файлов в папке с AJAX и PHP

Я повторил функцию javascript с помощью setInterval(), и он работает очень хорошо, но я хочу, чтобы 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

setInterval() функция многократно вызывает функцию с заданным интервалом. setTimeout() функция вызывает функцию раз после заданной задержки. Вы использовали неправильный ...

Вы получаете утечку памяти, потому что вы звоните setInterval() из внутри функции, поэтому каждый раз, когда он запускает он запускает дополнительный интервал, а затем те, нерест свои собственные и т. д., и нигде вы не очищаете интервал.

Вы могли бы назвать setInterval() из вне функции, измените if, чтобы решить, следует ли называть clearInterval(), чтобы остановить все это (Blaze Sahlzen's answer показывает, как сделать это аккуратно), но я думаю, что это гораздо проще использовать 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, но я оставлю это в качестве упражнения для читателя.

+0

Я думаю, что это лучший подход, потому что 'setInterval' не будет ждать предыдущего экземпляра, чтобы завершить обработку, если она занимает слишком много времени, и мы могли бы иметь несколько экземпляров работает, вызывая утечку памяти снова. Это вероятный сценарий? –

+1

@BlazeSahlzen - Ну, очевидно, 'SetTimeout()' версия гарантирует максимум один АЯКС вызова в то время, так что я предполагаю, что это безопаснее, хотя я просто понял, что я упростил немного, потому что надо было, потому что надо было поставить 'if' в обработчике' onreadstatechange' (что я сделаю сейчас), а также я должен был разрешить ajax-ошибки (которые я не могу беспокоить). По крайней мере, 'setInterval()' будет продолжать опрос, даже если возникают ошибки. – nnnnnn

+0

Я использовал код в этом ответе, и он отлично работает! Спасибо. Тем не менее, оба ответа были очень полезными, и я многому научился у них обоих. Спасибо – userlip

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 функцию, когда вы достигли определенного условия.

+1

Хорошая работа. Вы избавили меня от необходимости писать эту технику в своем собственном ответе, я только что связался с вами. – nnnnnn

+0

Спасибо! Но вы все равно избили меня до ответа: p @nnnnnn –

+0

Ну ладно. Если бы я потратил время на то, чтобы написать оба варианта спереди, возможно, вы были первыми, но я понял, что версия 'setTimeout() была проще, так что это то, с чем я пошел. – nnnnnn