JavaScript — setTimeout перестает работать

У меня есть страница, на которой я хочу, чтобы значение постоянно обновлялось из файла.

По сути, у меня есть скрипт, сохраняющий некоторые данные для показа в Интернете в виде текстового файла, а затем я хочу показать эти данные в Интернете. Данные в текстовом файле будут обновляться каждые 20 секунд или около того.

Это хорошо работает в первые 3 минуты или около того, затем страница перестает обновляться. Есть идеи, почему это происходит?

function updatepot(elementid) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById(elementid).innerHTML = this.responseText;
}
};
xmlhttp.open("GET", "../readData.php?q=" + elementid, true);
xmlhttp.send();

}

function updatePots()
{
updatepot("pot0");
}
function keeprunning()
{
setTimeout(updatePots, 1000);
keeprunning();
}<?php
// get the q parameter from URL
$file = $_REQUEST["q"] . ".txt";
$myfile = fopen("potData/".$file, "r") or die("Unable to open file!");
$myData;
while(!feof($myfile)) {
$myData =  $myData . fgets($myfile);
}
fclose($myfile);
echo $myData;
?>

4

Решение

Ваш метод keepRunning вызывается немедленно, как только вызывается функция setTimeout. Это означает, что вместо того, чтобы вызывать его каждую секунду, как вы, вероятно, намереваетесь, он вызывается постоянно (тысячи раз в секунду) — вы быстро столкнетесь с проблемами памяти, и все перестанет работать.

Чтобы это исправить, вызовите keepRunning в конце функции updatePots:

function updatePots()
{
updatepot("pot0");
keeprunning();
}
function keeprunning()
{
setTimeout(updatePots, 1000);
}
6

Другие решения

Если вы хотите, чтобы функция запускалась периодически, используйте setInterval вместо setTimeout — таким образом, вам не нужно иметь дело со сбросом интервала:

function updatepots()
{
updatepot("pot0");
}

window.setInterval(updatePots, 1000);
4

Назовите это так:

function updatePots()
{
updatepot("pot0");
keeprunning();
setTimeout(updatePots, 1000);
}
0
По вопросам рекламы [email protected]