Un mejor uso de jAndy 's answer de implementar una función de sondeo que urnas cada interval
segundos, y termina después timeout
segundos.
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);
ACTUALIZACIÓN
Según el comentario, actualizándolo para la capacidad de la función pasada para detener la interrogación:
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.
}
}
No es posible hacer la próxima llamada antes de que el código termine de ejecutarse. El temporizador realiza una cuenta regresiva de forma asíncrona, pero la devolución de llamada debe ponerse en cola. Esto significa que su devolución de llamada puede (y probablemente lo hará) disparar después de más de 60 segundos. –
La diferencia es que setInterval generalmente ejecutará la función x milisegundos después del ** inicio ** de la iteración anterior, mientras que el enfoque aquí se ejecutará la siguiente iteración x milisegundos después de la anterior ** finalizó ** – Gareth
@Andy E's head , @Gareth: Gareth tiene razón, ese enfoque simplemente evita que el código de bucle se ejecute mientras otro bloque de código aún se está ejecutando. – jAndy