2015-09-01 3 views
0

У меня просто есть json-страница в localhost, и я сохраняю данные этой страницы в файле, мне нужно сохранить эту страницу каждые 5 секунд, поэтому я разработал этот код в ajax, используя страницу в php с командой exec, Я использовал функцию setinterval для обновления, но мой код выполняет функцию getRequest только один раз. Здесь HTML:Ajax, почему функция setInterval не работает?

<script type="text/javascript"> 
    // handles the click event for link 1, sends the query 
    function getOutput() { 
    setInterval(function(){ 
getRequest(
     'prova1.php', // URL for the PHP file 
     drawOutput, // handle successful request 
     drawError // handle error 
); 
    return false; 
    },3000); 
} 
// handles drawing an error message 
function drawError() { 
    var container = document.getElementById('output'); 
    container.innerHTML = 'Bummer: there was an error!'; 
} 
// handles the response, adds the html 
function drawOutput(responseText) { 
    var container = document.getElementById('output'); 
    container.innerHTML = responseText; 
} 
// helper function for cross-browser request object 
function getRequest(url, success, error) { 
    var req = false; 
    try{ 
     // most browsers 
     req = new XMLHttpRequest(); 
    } catch (e){ 
     // IE 
     try{ 
      req = new ActiveXObject("Msxml2.XMLHTTP"); 
     } catch(e) { 
      // try an older version 
      try{ 
       req = new ActiveXObject("Microsoft.XMLHTTP"); 
      } catch(e) { 
       return false; 
      } 
     } 
    } 
    if (!req) return false; 
    if (typeof success != 'function') success = function() {}; 
    if (typeof error!= 'function') error = function() {}; 
    req.onreadystatechange = function(){ 
     if(req.readyState == 4) { 
      return req.status === 200 ? 
       success(req.responseText) : error(req.status); 
     } 
    } 
    req.open("GET", url, true); 
    req.send(null); 
    return req; 
} 
</script> 

А вот страница PHP:

<?php 
    exec(" wget http://127.0.0.1:8082/Canvases/Fe0_Cbc1_Calibration/root.json -O provami3.json", $output); 
    echo 'ok'; 
?> 

Я новичок в PHP, JavaScript Ajax и т.д., и Im обучения его часть во время, я знаю, что может быть, есть простой способ для него использовать jQuery, но пока я изучаю Ajax, поэтому я хотел бы получить совет для этого с Ajax. Спасибо всем.

+0

Потому что вы использовали 'return false;' в 'setInterval()'. – Manwal

+0

@Manwal, return false не влияет на setInterval –

+0

Почему, по вашему мнению, он работает только один раз? –

ответ

-1

1) Вернуть false в конце метода setInterval, я не считаю, что это необходимо.

2) Используйте глобальную переменную для хранения setInterval (это также даст вам возможность отменить setInterval). ?

var myInterval; 
function getOutput() { 
    myInterval = setInterval(function(){ 
getRequest(
     'prova1.php', // URL for the PHP file 
     drawOutput, // handle successful request 
     drawError // handle error 
); 
    },3000); 
} 
+0

Как это относится к проблеме «только работает один раз»? –

+0

return false может убивать любые последующие интервальные вызовы, и в прошлом я обнаружил множество проблем, не имеющих глобальной переменной setInterval (в зависимости от браузера) – DragonZero

0

JS прекрасно, смотрите пример здесь считая петли https://jsfiddle.net/tk9kfdna/1/

<div id="output"></div> 
<div id="log"></div> 
<script type="text/javascript"> 
// handles the click event for link 1, sends the query 

var times=0; 

function getOutput() { 
    setInterval(function(){ 
getRequest(
    'prova1.php', // URL for the PHP file 
    drawOutput, // handle successful request 
    drawError // handle error 
); 
    return false; 
    },3000); 
} 
// handles drawing an error message 
function drawError() { 
var container = document.getElementById('output'); 
container.innerHTML = 'Bummer: there was an error!'; 
} 
// handles the response, adds the html 
function drawOutput(responseText) { 
var container = document.getElementById('output'); 
container.innerHTML = responseText; 
} 
function getRequest(url, success, error) { 

times++; 

var req = false; 
try{ 
    // most browsers 
    req = new XMLHttpRequest(); 
} catch (e){ 
    // IE 
    try{ 
     req = new ActiveXObject("Msxml2.XMLHTTP"); 
    } catch(e) { 
     // try an older version 
     try{ 
      req = new ActiveXObject("Microsoft.XMLHTTP"); 
     } catch(e) { 
      return false; 
     } 
    } 
} 
if (!req) return false; 
if (typeof success != 'function') success = function() {}; 
if (typeof error!= 'function') error = function() {}; 
req.onreadystatechange = function(){ 
    if(req.readyState == 4) { 
     return req.status === 200 ? 
      success(req.responseText) : error(req.status); 
    } 
} 
req.open("GET", url, true); 
req.send(null); 

var log = document.getElementById('log'); 
log.innerHTML = 'Loop:'+times; 

return req; 


} 

getOutput(); 
</script> 

Предполагая, что здесь ваше призвание getOutput() где-то в том, что не был включен в первоначальный вопрос, если не может просто быть. В противном случае то, что может произойти, - это ответ от prova1.php, который никогда не принимается, и поэтому сценарий выглядит так, как будто он не работает. Тайм-аут по умолчанию для запроса XMLHttpRequest равен 0, что означает, что он будет работать вечно, если вы не укажете таймаут.

Попробуйте установить более короткий тайм-аут, добавив

req.timeout = 2000; // two seconds 

Вероятно, существует проблема с prova1.php? make prova1.php работает нормально, когда вы пытаетесь сделать это автономно.

Смежные вопросы