2011-09-06 3 views
4

J'ai une fonction de script Java qui prend un undefined pour terminer. Dans une boucle, je veux attendre que la fonction soit terminée, puis attendre une durée définie (par exemple 5000 ms) et appeler à nouveau la fonction. Comment puis-je accomplir cela dans Java Script?Appel d'une fonction asynchrone toutes les N secondes en JavaScript

Fondamentalement, je veux ceci:

call function and wait until it is finished 
wait another 5000 seconds 
call function and wait until it is finished 
wait another 5000 seconds 
... 

La fonction elle-même ressemble à ceci:

for every group in list 

    .ajax(delete group items; get group items; add group items) 

Le problème que j'ai actuellement est que dans le milieu de la boucle la fonction est en quelque sorte appelé à nouveau.

Répondre

6

une fonction qui s'invoque récursive à la fin d'une minuterie:

(function my_func() { 
    // your code 
    setTimeout(my_func, 5000); 
})(); 

Cela appelle immédiatement my_func, puis invoque récursive à la fin de la fonction après un délai de 5 secondes. De cette façon, la minuterie ne commence pas tant que le code n'est pas terminé.


Vous pouvez placer le setTimeout() dans une déclaration if pour faire la récursivité en fonction de certains critères:

(function my_func() { 
    // your code 
    if(some_criteria_is_met) { 
     setTimeout(my_func, 5000); 
    } 
})(); 

Notez que cela implique que votre code est synchrone. Si vous exécutez du code asynchrone , comme une requête AJAX, l'approche sera un peu différente.

+0

Vous avez raison. J'utilise la requête AJAX. Je vais mettre à jour la question. – xsl

+1

Ce n'est pas si différent que ça - demandez à votre callback AJAX de faire l'appel à setTimeout (en supposant que votre fonction .ajax ait la fonctionnalité de rappel quand elle se termine avec succès). Que comptez-vous faire si l'appel AJAX ne se termine pas avec succès? – RobG

+0

J'ignorerais les appels infructueux. J'ai effectivement plusieurs appels AJAX dans la fonction, donc je ne peux pas vraiment faire un setTimeout si l'on réussit. – xsl

Questions connexes