Existe-t-il un moyen de faire une veille en JavaScript avant d'effectuer une autre action?
Exemple:
var a = 1+3;
// Sleep 3 seconds before the next action here
var b = a + 4;
javascript
sleep
Jin Yong
la source
la source
Au cas où vous auriez vraiment besoin
sleep()
de tester quelque chose. Mais sachez qu'il plantera le navigateur la plupart du temps pendant le débogage - c'est probablement pourquoi vous en avez besoin de toute façon. En mode production, je commenterai cette fonction.N'utilisez pas
new Date()
dans la boucle, sauf si vous souhaitez gaspiller de la mémoire, de la puissance de traitement, de la batterie et éventuellement la durée de vie de votre appareil.la source
Version ECMAScript 6, utilisant des générateurs avec rendement pour "blocage de code":
Parce que la question originale a été postée il y a sept ans, je n'ai pas pris la peine de répondre avec le code exact, car c'est trop facile et déjà répondu. Cela devrait vous aider dans des problèmes plus compliqués, comme si vous avez besoin d'au moins deux sommeil, ou si vous prévoyez de séquencer une exécution asynchrone. N'hésitez pas à le modifier en fonction de vos besoins.
fonction*
() => fonction flèche
Vous pouvez également enchaîner des événements via Promises :
Ou une manière beaucoup plus simple et moins sophistiquée serait
Si vous attendez juste qu'une condition se produise, vous pouvez attendre comme ça
la source
Mise à jour 2018
Les derniers Safari, Firefox et Node.js prennent désormais également en charge async / await / promises.
Utilisation de async / await / Promises:
(À partir de 1/2017, pris en charge sur Chrome, mais pas sur Safari, Internet Explorer, Firefox, Node.js)
Mise à jour 2017
JavaScript a évolué depuis que cette question a été posée et a maintenant des fonctions de générateur, et le nouveau async / await / Promise est en cours de déploiement.
Ci-dessous, il y a deux solutions, une avec une fonction de générateur qui fonctionnera sur tous les navigateurs modernes, et une autre, utilisant le nouveau async / await qui n'est pas encore pris en charge partout.Utilisation d'une fonction générateur:
Faites attention au fait que ces deux solutions sont de nature asynchrone. Cela signifie que myAsyncFunc (dans les deux cas) reviendra pendant le sommeil.
Il est important de noter que cette question est différente de Quelle est la version JavaScript de sleep ()? où le demandeur demande un vrai sommeil (aucune autre exécution de code sur le processus) plutôt qu'un délai entre les actions.
la source
let co = gen => (...args) => { let iter = gen(...args); let resume = () => new Promise((resolve, reject) => { let result = iter.next(); if (result.done) resolve(result.value); else Promise.resolve(result.value).then(resume).then(resolve, reject); }); return resume(); };
vous permettrait d'let asyncAdd = co(function* (a, b) { console.log('Sleeping'); yield sleep(3000); console.log('Done'); return a + b; }); asyncAdd(3, 4).then(console.log);
utiliser la définition de àsleep()
partir de votre deuxième bloc de code.Si vous voulez des fonctions moins maladroites que
setTimeout
etsetInterval
, vous pouvez les encapsuler dans des fonctions qui inversent simplement l'ordre des arguments et leur donnent de jolis noms:Versions de CoffeeScript:
Vous pouvez ensuite les utiliser joliment avec des fonctions anonymes:
Maintenant, il se lit facilement comme "après N millisecondes, ..." (ou "toutes les N millisecondes, ...")
la source
Une autre façon de le faire est d'utiliser Promise et setTimeout (notez que vous devez être à l'intérieur d'une fonction et la définir comme asynchrone avec le mot clé async):
la source
Voici un moyen très simple de le faire qui «ressemble» à un sommeil / pause synchrone, mais qui est un code async js légitime.
la source
Vous pouvez utiliser du javascript simple, cela appellera votre fonction / méthode après 5 secondes:
la source
Il existe plusieurs façons de résoudre ce problème. Si nous utilisons la
setTimeout
fonction, apprenons à la connaître en premier. Cette fonction a trois paramètres:function
oucode
,delay
(en millisecondes) et leparameters
. Le paramètre de fonction ou de code étant obligatoire, les autres sont facultatifs. Une fois que vous n'avez pas saisi le délai , il sera remis à zéro.Pour plus de détails sur le,
setTimeout()
allez sur ce lien .Version simplifiée:
Utilisation de la passe de paramètres:
Prise en charge du navigateur:
la source
C'est mon modèle qui montre comment "dormir" ou "DoEvents" en javascript à l'aide d'une fonction générateur (ES6). Code commenté:
la source
Essayez cette fonction:
Voici comment vous l'utilisez:
Ou allez-y avec style:
Voici une démo .
la source