Je voudrais ajouter un délai / sommeil à l'intérieur d'une while
boucle:
Je l'ai essayé comme ça:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
Seul le premier scénario est vrai: après affichage alert('hi')
, il attendra 3 secondes puis alert('hello')
s'affichera mais alert('hello')
se répétera constamment.
Ce que je voudrais, c'est qu'après alert('hello')
s'affiche 3 secondes après, alert('hi')
il doit attendre 3 secondes pour la deuxième fois alert('hello')
et ainsi de suite.
la source
for in
boucle?Object.keys()
setTimeout
avecsetInterval
. Les délais d'attente sont implicitement détruits lorsque le rappel est appelé.Essayez quelque chose comme ceci:
la source
Si vous utilisez ES6, vous pouvez utiliser
let
pour y parvenir:Qu'est
let
- ce que c'est déclareri
pour chaque itération , pas la boucle. De cette façon, ce qui est transmissetTimeout
est exactement ce que nous voulons.la source
i*3000
argument, à l'intérieur de la boucle, et la transmet àsetTimeout
par valeur. L'utilisation delet
est facultative et sans rapport avec la question et la réponse.i < 10
), de sorte que plusieurs minuteries fonctionnent en parallèle, ce qui crée une allocation de mémoire et c'est pire sur une plus grande quantité d'itérations.Depuis ES7 il y a une meilleure façon d' attendre une boucle:
Lorsque le moteur atteint la
await
pièce, il définit un délai d'attente et arrête l'exécution de laasync function
. Ensuite, lorsque le délai est écoulé, l'exécution se poursuit à ce stade. C'est très utile car vous pouvez retarder (1) les boucles imbriquées, (2) conditionnellement, (3) les fonctions imbriquées:Référence sur MDN
Alors que ES7 est désormais pris en charge par NodeJS et les navigateurs modernes, vous voudrez peut-être le transpiler avec BabelJS pour qu'il fonctionne partout.
la source
break;
peut-être?Une autre façon consiste à multiplier le délai d'expiration, mais notez que ce n'est pas comme le sommeil . Le code après la boucle sera exécuté immédiatement, seule l'exécution de la fonction de rappel est différée.
La première temporisation sera définie sur
3000 * 1
, la seconde sur3000 * 2
et ainsi de suite.la source
start
intérieur de votre fonction en utilisant cette méthode.Cela fonctionnera
Essayez ce violon: https://jsfiddle.net/wgdx8zqq/
la source
$.Deferred
mais c'était un scénario différent pour le laisser fonctionner, bravo ..!Je pense que vous avez besoin de quelque chose comme ça:
Code de test:
Remarque: l'utilisation d'alertes bloque l'exécution de javascript jusqu'à la fermeture de l'alerte. Il peut s'agir de plus de code que vous n'en avez demandé, mais il s'agit d'une solution robuste et réutilisable.
la source
J'utiliserais probablement
setInteval
. Comme ça,la source
SetInterval()
génération de «threads» continue même en cas d'erreur ou de blocage.Dans ES6 (ECMAScript 2015), vous pouvez itérer avec retard avec générateur et intervalle.
Exemple de code:
Donc, si vous utilisez ES6, c'est la façon la plus élégante de réaliser une boucle avec retard (à mon avis).
la source
Vous pouvez utiliser l' opérateur d'intervalle RxJS . L'intervalle émet un entier toutes les x nombre de secondes, et prend est spécifier le nombre de fois où il doit émettre des nombres
la source
Je pensais juste publier mes deux cents ici aussi. Cette fonction exécute une boucle itérative avec un retard. Voir ce jsfiddle . La fonction est la suivante:
Par exemple:
Serait équivalent à:
la source
Je fais cela avec Bluebird's
Promise.delay
et récursivité.la source
Dans ES6, vous pouvez procéder comme suit:
Dans ES5, vous pouvez faire comme:
La raison en est,
let
vous permet de déclarer des variables qui sont limitées à la portée d'une instruction de bloc, ou une expression sur laquelle elle est utilisée, contrairement auvar
mot clé, qui définit une variable globalement, ou localement à une fonction entière quelle que soit la portée du bloc.la source
Afficher l'extrait de code
Une version modifiée de la réponse de Daniel Vassallo, avec des variables extraites en paramètres pour rendre la fonction plus réutilisable:
Définissons d'abord quelques variables essentielles:
Ensuite, vous devez définir la fonction que vous souhaitez exécuter. Cela passera i, l'index actuel de la boucle et la longueur de la boucle, au cas où vous en auriez besoin:
Version auto-exécutable
Version fonctionnelle
la source
la source
Tu le fais:
la source
la source
Voici comment j'ai créé une boucle infinie avec un retard qui se casse à une certaine condition:
La clé ici est de créer une nouvelle promesse qui se résout par timeout, et d'attendre sa résolution.
Évidemment, vous avez besoin d'un support asynchrone / wait pour cela. Fonctionne dans le nœud 8.
la source
pour une utilisation courante "oubliez les boucles normales" et utilisez cette combinaison de "setInterval", y compris "setTimeOut": comme ceci (de mes tâches réelles).
PS: Comprenez que le comportement réel de (setTimeOut): ils commenceront tous en même temps "les trois bla bla bla commenceront à décompter au même moment" alors faites un timeout différent pour organiser l'exécution.
PS 2: l'exemple de la boucle de synchronisation, mais pour une boucle de réaction, vous pouvez utiliser des événements, promettre une asynchrone en attente.
la source
la source
À ma connaissance, la
setTimeout
fonction est appelée de manière asynchrone. Ce que vous pouvez faire est d'enrouler la boucle entière dans une fonction asynchrone et d'attendre unPromise
qui contient le setTimeout comme indiqué:Et puis vous appelez l'exécuter comme suit:
Veuillez prendre un peu de temps pour bien comprendre la programmation asynchrone.
la source
Essayez ceci
Résultat
la source
Voici une fonction que j'utilise pour boucler sur un tableau:
Vous l'utilisez comme ceci:
la source
Ce script fonctionne pour la plupart des choses
la source
Essaye ça...
la source
Implémentation simple de l'affichage d'un morceau de texte toutes les deux secondes tant que la boucle est en cours d'exécution.
la source
Essaye ça
la source