2016-09-02 2 views
2

Ich habe ein paar große Formulare, die Probleme mit dem Ausfüllen vor dem Sitzungszeitlimit verursachen. Ich brauche ein kleines Javascript, um am Ende der Seite einzufügen, um alle paar Minuten eine Datei zu pingen, um das Session-Timeout zu aktualisieren, solange die Seite geöffnet ist. Ich habe also eine Funktion, die die letzte Anweisung ist, die Funktion nach einer Lücke erneut aufzurufen. Aus verschiedenen Gründen sind jQuery und andere Frameworks dafür nicht verfügbar. So habe ich das zusammen von https://stackoverflow.com/a/35970894/385011Mein Heartbeat pausiert nicht für Timeout-Wert

var getJSON = function(url, callback) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("get", url, true); 
    xhr.responseType = "json"; 
    xhr.onload = function() { 
     var status = xhr.status; 
     if (status == 200) { 
      callback(null, xhr.response); 
     } else { 
      callback(status); 
     } 
    }; 
    xhr.send(); 
}; 

//hearbeat 
function heartbeat(heartbeaturl){ 
    getJSON(heartbeaturl,function(err, data) { 
     console.log(Date.now()); 
     console.log(data.time); 
     setTimeout(heartbeat(heartbeaturl), data.time); 
    }); 
} 

console.log("run heartbeat"); 
heartbeat("heartbeat.json") 

data.time 60000 zurückkehrt, so sollte es Herzschlag pro Minute laufen, aber es sin alle 1 ~ 4 ms ausgeführt wird. Was vermisse ich?

Antwort

2

Das ist das "setTimeout Problem". Leute vergessen, was setTimeout tut:

function setTimeout(func){ 
//wait 
func(); 
} 

Sie müssen also eine Funktion übergeben, um Timeout zu setzen. Was Sie wirklich tun ist: Sie passieren das Ergebnis der Funktion: Was Sie tun:

setTimeout(func(parameter),1000); 

Was Sie tun möchten:

setTimeout(func,1000); 

Aber wie die Parameter zu übergeben? Das ist einfach:

setTimeout(function(){func(parameter)},1000); 
1
setTimeout(heartbeat(heartbeaturl), data.time); 

Sollte etwas wie:

setTimeout(function() { 
    heartbeat(heartbeaturl); 
}, data.time) 

Wie sonst heartbeat(heartbeaturl) wird sofort ausgeführt, ohne data.time zu warten erreicht werden.

+1

Alternativ zum Erstellen einer neuen anonymen Funktion ist die Übergabe der Parameter an 'setTimeout' wie so - 'setTimeout (Heartbeat, data.time, heartbeaturl)'. Alles nach der Verzögerung wird an die verzögerte Funktion übergeben, wenn sie ausgeführt wird. – vlaz

Verwandte Themen