C'est là un moyen de configurer la setInterval
méthode de javascript pour exécuter la méthode immédiatement, puis s'exécute avec le minuteur
javascript
setinterval
Jorge
la source
la source
function
une fois puis de faire lesetInterval()
Réponses:
Il est plus simple d'appeler directement la fonction directement la première fois:
Cependant, il y a de bonnes raisons d'éviter
setInterval
- en particulier dans certaines circonstances, toute une série d'setInterval
événements peuvent arriver immédiatement les uns après les autres sans aucun retard. Une autre raison est que si vous voulez arrêter la boucle, vous devez appeler explicitement,clearInterval
ce qui signifie que vous devez vous souvenir du handle renvoyé par l'setInterval
appel d' origine .Donc, une autre méthode consiste à se
foo
déclencher pour les appels suivants en utilisant à lasetTimeout
place:Cela garantit qu'il y a au moins un intervalle
delay
entre les appels. Cela facilite également l'annulation de la boucle si nécessaire - vous n'appelez simplement passetTimeout
lorsque votre condition de fin de boucle est atteinte.Mieux encore, vous pouvez envelopper tout cela dans une expression de fonction immédiatement invoquée qui crée la fonction, qui se rappelle ensuite comme ci-dessus et démarre automatiquement la boucle:
qui définit la fonction et démarre le cycle d'un seul coup.
la source
setTimeout
?setInterval
événements peut arriver immédiatement les uns après les autres sans aucun retard.setTimeout
méthode?Je ne sais pas si je vous comprends bien, mais vous pourriez facilement faire quelque chose comme ça:
Il y a évidemment un certain nombre de façons de procéder, mais c'est la façon la plus concise à laquelle je peux penser.
la source
arguments.callee
n'est pas disponible en mode strict ES5Je suis tombé sur cette question en raison du même problème, mais aucune des réponses n'aide si vous devez vous comporter exactement comme
setInterval()
mais avec la seule différence que la fonction est appelée immédiatement au début.Voici ma solution à ce problème:
L'avantage de cette solution:
setInterval
peut facilement être adapté par substitutionclearInterval()
plus tardExemple:
Pour être effronté, si vous avez vraiment besoin d'utiliser,
setInterval
vous pouvez également remplacer l'originalsetInterval
. Par conséquent, aucun changement de code n'est requis lors de l'ajout avant votre code existant:Pourtant, tous les avantages énumérés ci-dessus s'appliquent ici, mais aucune substitution n'est nécessaire.
la source
setTimeout
solution car elle renvoie unsetInterval
objet. Pour éviter d'appeler des fonctions qui sont peut-être plus tard dans le code et donc indéfinies à l'heure actuelle, j'encapsule le premier appel de fonction dans unesetTimeout
fonction comme celle-ci:setTimeout(function(){ func();},0);
La première fonction est ensuite appelée après le cycle de traitement en cours, qui est également immédiatement , mais est plus d'erreur prouvée.Vous pouvez encapsuler
setInterval()
une fonction qui fournit ce comportement:... puis utilisez-le comme ceci:
la source
Voici un wrapper pour le faire si vous en avez besoin:
Définissez le troisième argument de setInterval sur true et il s'exécutera pour la première fois immédiatement après l'appel de setInterval:
Ou omettez le troisième argument et il conservera son comportement d'origine:
Certains navigateurs prennent en charge des arguments supplémentaires pour setInterval que ce wrapper ne prend pas en compte; Je pense que ceux-ci sont rarement utilisés, mais gardez cela à l'esprit si vous en avez besoin.
la source
Car quelqu'un a besoin d'amener l'extérieur
this
comme s'il s'agissait d'une fonction de flèche.Si les déchets ci-dessus vous dérangent, vous pouvez faire une fermeture à la place.
Ou peut-être envisagez d'utiliser le
@autobind
décorateur en fonction de votre code.la source
Je proposerai d'appeler les fonctions dans l'ordre suivant
Vous pouvez également passer
_timer
au foo, si vous le souhaitez àclearInterval(_timer)
une certaine conditionla source
Voici une version simple pour les novices sans tous les ennuis. Il déclare simplement la fonction, l'appelle, puis démarre l'intervalle. C'est tout.
la source
Pour résoudre ce problème, j'exécute la fonction une première fois après le chargement de la page.
la source
Il existe un package npm pratique appelé firstInterval (divulgation complète, c'est le mien).
La plupart des exemples ici n'incluent pas la gestion des paramètres, et changer les comportements par défaut de
setInterval
tout grand projet est mauvais. De la documentation:Ce modèle
est identique à
Si vous êtes de la vieille école dans le navigateur et que vous ne voulez pas de dépendance, c'est un simple copier-coller du code.
la source
Ok, c'est tellement complexe, alors, permettez-moi de le dire plus simplement:
la source
Vous pouvez définir un temps de retard initial très petit (par exemple 100) et le régler sur le temps de retard souhaité dans la fonction:
la source
Il y a un problème avec l'appel asynchrone immédiat de votre fonction, car setTimeout / setInterval standard a un délai minimal d'environ plusieurs millisecondes même si vous le définissez directement sur 0. Cela est dû à un travail spécifique au navigateur.
Un exemple de code avec un REAL zéro retard qui fonctionne dans Chrome, Safari, Opera
Vous pouvez trouver plus d'informations ici
Et après le premier appel manuel, vous pouvez créer un intervalle avec votre fonction.
la source
en fait le plus rapide est de faire
cela appellera ma fonction, puis le fera toutes les 45 secondes, ce qui est différent de faire
qui ne l'appellera pas, mais le planifiera seulement
la source
myFunction()
retourne. Au lieu de cela, modifier chaque fonction à appelersetInterval
est une meilleure approche pour bouclersetInterval
une fois comme les autres réponses le proposent.