Un migliore utilizzo dei jAndy s' answer per implementare una funzione di polling che i sondaggi ogni interval
secondi, e termina dopo timeout
secondi.
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
Come per il commento, l'aggiornamento per la capacità della funzione passata per fermare il polling:
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.
}
}
fonte
2015-08-06 07:18:14
Non è possibile effettuare la prossima chiamata prima che il codice termini l'esecuzione. Il timer esegue il conto alla rovescia in modo asincrono ma la richiamata deve essere accodata. Ciò significa che il tuo callback potrebbe (e probabilmente lo farà) sparare dopo più di 60 secondi. –
La differenza è che setInterval eseguirà generalmente la funzione x millisecondi dopo il ** start ** della precedente iterazione, mentre l'approccio qui eseguirà la successiva iterazione x millisecondi dopo quella precedente ** terminato ** – Gareth
@Andy E's head , @Gareth: Gareth ha ragione, quell'approccio evita solo che il codice di loop venga eseguito mentre un altro codice è ancora in esecuzione. – jAndy