Eine bessere Nutzung von jAndy ‚s answer eine Abfragefunktion, die Umfragen alle interval
Sekunden, und endet nach timeout
Sekunden zu implementieren.
function pollFunc(fn, timeout, interval) {
var startTime = (new Date()).getTime();
interval = interval || 1000;
(function p() {
fn();
if (((new Date).getTime() - startTime) <= timeout) {
setTimeout(p, interval);
}
})();
}
pollFunc(sendHeartBeat, 60000, 1000);
UPDATE
Gemäß dem Kommentar, es für die Fähigkeit der übergebenen Funktion der Aktualisierung der Abfrage zu stoppen:
function pollFunc(fn, timeout, interval) {
var startTime = (new Date()).getTime();
interval = interval || 1000,
canPoll = true;
(function p() {
canPoll = ((new Date).getTime() - startTime) <= timeout;
if (!fn() && canPoll) { // ensures the function exucutes
setTimeout(p, interval);
}
})();
}
pollFunc(sendHeartBeat, 60000, 1000);
function sendHeartBeat(params) {
...
...
if (receivedData) {
// no need to execute further
return true; // or false, change the IIFE inside condition accordingly.
}
}
Es ist nicht möglich, den nächsten Anruf zu tätigen, bevor der Code beendet wird. Der Timer zählt asynchron herunter, aber der Callback muss in die Warteschlange gestellt werden. Dies bedeutet, dass Ihr Rückruf nach mehr als 60 Sekunden ausgelöst werden kann (und wahrscheinlich auch wird). –
Der Unterschied besteht darin, dass setInterval wird in der Regel die Funktion x Millisekunden, nachdem das ** ** der vorherigen Iteration beginnen, wobei hier der Ansatz wird die nächste Iteration x Millisekunden nach dem vorherigen Laufe ** ** beenden – Gareth
@Andy E Kopf , @Gareth: Gareth hat recht, dieser Ansatz vermeidet nur, dass der Schleifencode ausgeführt wird, während ein anderer Codeblock noch läuft. – jAndy