Une meilleure utilisation de l » answerjAndy pour mettre en œuvre une fonction de vote que les sondages tous les interval
secondes, et se termine après timeout
secondes.
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);
MISE À JOUR
Selon le commentaire, la mise à jour pour la capacité de la fonction passée pour arrêter le vote:
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.
}
}
Il n'est pas possible que l'appel suivant soit effectué avant que le code ne soit terminé. La minuterie compte de manière asynchrone, mais le rappel doit être mis en file d'attente. Cela signifie que votre callback peut (et probablement se déclenchera) après plus de 60 secondes. –
La différence est que setInterval exécute généralement la fonction x millisecondes après le ** début ** de l'itération précédente, alors que l'approche ici exécute l'itération suivante x millisecondes après la précédente ** terminée ** – Gareth
@Andy E tête , @Gareth: Gareth a raison, cette approche évite juste que le code de boucle soit exécuté alors qu'un autre codeblock est toujours en cours d'exécution. – jAndy