Je développe un script de console pour des besoins personnels. Je dois pouvoir faire une pause pendant une période prolongée, mais, d'après mes recherches, Node.js n'a aucun moyen de s'arrêter comme requis. Il devient difficile de lire les informations des utilisateurs après un certain temps ... J'ai vu du code, mais je pense qu'ils doivent avoir un autre code à l'intérieur d'eux pour qu'ils fonctionnent, tels que:
setTimeout(function() {
}, 3000);
Cependant, j'ai besoin de tout après cette ligne de code pour exécuter après la période de temps.
Par exemple,
// start of code
console.log('Welcome to my console,');
some-wait-code-here-for-ten-seconds...
console.log('Blah blah blah blah extra-blah');
// end of code
J'ai aussi vu des choses comme
yield sleep(2000);
Mais Node.js ne le reconnaît pas.
Comment puis-je réaliser cette pause prolongée?
javascript
node.js
yield
Christopher Allen
la source
la source
require("child_process").execSync('php -r "sleep($argv[1]);" ' + seconds);
Réponses:
La meilleure façon de le faire est de diviser votre code en plusieurs fonctions, comme ceci:
Elle est similaire à la solution de JohnnyHK , mais beaucoup plus nette et plus facile à étendre.
la source
debugger;
Une nouvelle réponse à une vieille question. Aujourd'hui (
janvier 2017juin 2019), c'est beaucoup plus facile. Vous pouvez utiliser la nouvelleasync/await
syntaxe . Par exemple:Pour utiliserasync/await
hors de la boîte sans installation et plugins, vous devez utiliser node-v7 ou node-v8, en utilisant l'--harmony
indicateur.Mise à jour de juin 2019: en utilisant les dernières versions de NodeJS, vous pouvez l'utiliser immédiatement. Pas besoin de fournir d'arguments en ligne de commande. Même Google Chrome le prend en charge aujourd'hui.
Mise à jour de mai 2020: vous pourrez bientôt utiliser la
await
syntaxe en dehors d'une fonction asynchrone. Au niveau supérieur comme dans cet exempleLa proposition est à l'étape 3 . Vous pouvez l'utiliser aujourd'hui en utilisant le webpack 5 (alpha),
Plus d'informations:
la source
await
mot - clé devantsleep(1000)
let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
Pour les monstres oneliner comme moi :)let sleep = require('util').promisify(setTimeout);
fonctionne sur Node 7.6+ et améliore la lisibilitéLa solution la plus courte sans dépendances:
la source
let sleep = require('util').promisify(setTimeout);
est trois caractères plus long mais imo réutilisable et plus lisibleresolve
place dedone
. C'est-à-direawait new Promise(resolve => setTimeout(resolve, 5000))
Mettez le code que vous souhaitez exécuter après le délai dans le
setTimeout
rappel:la source
node-fibers
. Vérifiez-le.Il s'agit d'une technique de blocage simple:
C'est bloquant dans la mesure où rien d'autre ne se produira dans votre script (comme les rappels). Mais comme il s'agit d'un script de console, c'est peut-être ce dont vous avez besoin!
la source
wait
, il bloque et il fonctionne à des fins de test. Exactement ce que je cherchais.spin-wait
.Sur le nœud 7.6.0 ou supérieur
Le nœud prend en charge l'attente en natif:
alors si vous pouvez utiliser les fonctions asynchrones:
ou:
Sur les anciennes versions de Node (réponse originale)
Je voulais un sommeil asynchrone qui fonctionnait sous Windows et Linux, sans monopoliser mon processeur avec une longue boucle while. J'ai essayé le package sleep mais il ne s'installait pas sur ma box Windows. J'ai fini par utiliser:
https://www.npmjs.com/package/system-sleep
Pour l'installer, tapez:
Dans votre code,
Fonctionne comme un charme.
la source
Fonction de sommeil simple et élégante utilisant Javascript moderne
Pas de dépendances, pas d'enfer de rappel; c'est ça :-)
Compte tenu de l'exemple donné dans la question, voici comment nous dormirions entre deux journaux de console:
L'inconvénient est que votre fonction principale doit désormais l'être
async
également. Mais, étant donné que vous écrivez déjà du code Javascript moderne, vous utilisez probablement (ou du moins devrait l'être!) En utilisantasync
/await
partout dans votre code, donc ce n'est vraiment pas un problème. Tous les navigateurs modernes le supportent aujourd'hui .Donner un petit aperçu de la
sleep
fonction pour ceux qui n'y sont pas habituésasync/await
et des gros opérateurs de flèches, voici la façon verbeuse de l'écrire:Cependant, l'utilisation de l'opérateur de flèche grasse le rend encore plus petit (et plus élégant).
la source
async
et en laissant tout le reste inchangé. C'est probablement plus clair avec leasync
bien.async
. Modifié ma réponse avec votre suggestion. Je ne pense pas que cela rend le code plus clair; pour cela, je recourirais plutôt à JSDoc.const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
Vous pouvez utiliser ce www.npmjs.com/package/sleep
la source
MacOS
, mais il rencontre des erreurs enCentOS
raison d' erreurs node_gyp . Cela ne semble pas portable.Cette question est assez ancienne, mais récemment V8 a ajouté des générateurs qui peuvent accomplir ce que l'OP a demandé. Les générateurs sont généralement plus faciles à utiliser pour les interactions asynchrones avec l'aide d'une bibliothèque telle que la suspension ou la génération .
Voici un exemple d'utilisation de la suspension:
Lecture connexe (par le biais d'une auto-promotion éhontée): Quel est le gros problème avec les générateurs? .
la source
yield setTimeout(suspend.resume(), 10000);
--harmony
drapeau, et selon node.green, ils sont au moins disponibles sans drapeau depuis la v4.8.4: node.green/#ES2015-functions-generators-basic-functionality . Veuillez noter, cependant, que la nouvelleasync/await
syntaxe fournit une meilleure solution maintenant, sans avoir besoin de bibliothèques supplémentaires commesuspend
. Voir cette réponse pour un exemple: stackoverflow.com/a/41957152/376789 . Les fonctions asynchrones sont disponibles (sans drapeaux) depuis la v7.10.Sur Linux / nodejs, cela fonctionne pour moi:
Il bloque, mais ce n'est pas une boucle d'attente occupée.
Le temps que vous spécifiez est en secondes mais peut être une fraction. Je ne sais pas si d'autres OS ont une commande similaire.
la source
sleep
est à peu près omniprésent et un tout autour depuis les premiers jours UNIX en.wikipedia.org/wiki/Sleep_%28Unix%29 . Seulement « pas rare » os il peut - être pas exister est Windows (mais il vous pourriez essayerchild_process.spawnSync('timeout', ['/T', '10'])
Si vous voulez "coder le golf", vous pouvez faire une version plus courte de certaines des autres réponses ici:
Mais vraiment la réponse idéale à mon avis est d'utiliser la
util
bibliothèque de Node et sapromisify
fonction, qui est conçue exactement pour ce genre de chose (faire des versions basées sur des promesses de choses non basées sur des promesses):Dans les deux cas, vous pouvez ensuite faire une pause simplement en utilisant
await
pour appeler votresleep
fonction:la source
await
. Il crée en quelque sorte un rappel, suspend les choses, puis redémarre le code lorsque ce rappel revient. Le rappel revient avec une valeur, mais nous ne nous en soucions pas dans ce cas, il n'y a donc rien à gauche deawait
.J'ai récemment créé une abstraction plus simple appelée wait.for pour appeler des fonctions asynchrones en mode sync (basé sur des fibres nodales ). Il existe également une version basée sur les générateurs ES6 à venir.
https://github.com/luciotato/waitfor
En utilisant wait.for , vous pouvez appeler n'importe quelle fonction asynchrone nodejs standard, comme s'il s'agissait d'une fonction de synchronisation, sans bloquer la boucle d'événements du node.
Vous pouvez coder séquentiellement quand vous en avez besoin, ce qui est (je suppose) parfait pour simplifier vos scripts pour un usage personnel.
en utilisant wait.for votre code sera:
Toute fonction asynchrone peut également être appelée en mode Sync . Vérifiez les exemples.
la source
TypeError: Object #<Object> has no method 'miliseconds'
wait.for/paralell-tests.js
j'ai rencontré une autre erreur liée à des propriétés non définies, etc. J'ai donc dû les copier aussi. Pourquoi n'organisez-vous pas le code de manière à ce que cela ne soit pas nécessaire?Depuis, le moteur javascript (v8) exécute du code basé sur la séquence d'événements dans la file d'attente des événements, il n'y a pas de stricte que javascript déclenche exactement l'exécution après l'heure spécifiée. Autrement dit, lorsque vous définissez quelques secondes pour exécuter le code ultérieurement, le code de déclenchement est purement basé sur la séquence dans la file d'attente d'événements. Le déclenchement de l'exécution du code peut donc prendre plus de temps que spécifié.
Alors Node.js suit,
pour exécuter le code plus tard à la place setTimeout (). Par exemple,
la source
Avec ES6 prenant en charge
Promise
s, nous pouvons les utiliser sans aucune aide tierce.Ensuite, utilisez-le comme ceci:
Notez que la
doWhat
fonction devient leresolve
rappel dans lenew Promise(...)
.Notez également qu'il s'agit d'un sommeil ASYNCHRONE. Il ne bloque pas la boucle d'événements. Si vous avez besoin de bloquer le sommeil, utilisez cette bibliothèque qui réalise le blocage du sommeil à l'aide de liaisons C ++. (Bien que le besoin d'un sommeil bloquant dans les environnements Node comme async soit rare.)
https://github.com/erikdubbelboer/node-sleep
la source
Ce code ci-dessus est l'effet secondaire de la résolution du problème d'enfer de rappel asynchrone de Javascript. C'est aussi la raison pour laquelle je pense que Javascript est un langage utile dans le backend. En fait, c'est à mon avis l'amélioration la plus excitante introduite dans le Javascript moderne. Pour bien comprendre comment cela fonctionne, le fonctionnement du générateur doit être parfaitement compris. Le
function
mot-clé suivi d'un*
est appelé une fonction de générateur dans Javascript moderne. Le package npmco
fournit une fonction runner pour exécuter un générateur.La fonction essentiellement générateur a fourni un moyen de suspendre l'exécution d'une fonction avec un
yield
mot clé, en même temps,yield
dans une fonction de générateur a permis d'échanger des informations entre l'intérieur du générateur et l'appelant. Cela a fourni un mécanisme permettant à l'appelant d'extraire des données d'unpromise
appel asynchrone et de renvoyer les données résolues au générateur. En effet, il rend un appel asynchrone synchrone.la source
Il s'agit d'un module aromatisé moment.js basé sur l' approche de blocage sale suggérée par @ atlex2 . Utilisez-le uniquement pour les tests .
la source
Si vous avez juste besoin de suspendre à des fins de test votre exécution actuelle du thread, essayez ceci:
la source
simple, nous allons attendre 5 secondes pour qu'un événement se produise (cela serait indiqué par une variable done définie sur true ailleurs dans le code) ou lorsque le délai expirera que nous vérifierons toutes les 100 ms
la source
Pour certaines personnes, la réponse acceptée ne fonctionne pas, j'ai trouvé cette autre réponse et elle fonctionne pour moi: comment puis-je passer un paramètre à un rappel setTimeout ()?
'bonjour' est le paramètre transmis, vous pouvez passer tous les paramètres après le délai d'expiration. Merci à @Fabio Phms pour la réponse.
la source
Au lieu de faire tous ces setTimeout, sleep et bien d'autres choses, il vaut mieux utiliser
la source
Les autres réponses sont excellentes mais j'ai pensé que je prendrais un tact différent.
Si tout ce que vous recherchez est de ralentir un fichier spécifique sous Linux:
nœud myprog slowfile
Cela dormira 1 seconde toutes les cinq lignes. Le programme de nœud ira aussi lentement que l'écrivain. S'il fait autre chose, il continuera à vitesse normale.
Le mkfifo crée un tuyau premier entré, premier sorti. C'est ce qui fait que ça marche. La ligne Perl écrira aussi vite que vous le souhaitez. Le $ | = 1 dit de ne pas mettre en tampon la sortie.
la source
J'ai mis en place, après avoir lu les réponses à cette question, une fonction simple qui peut également faire un rappel, si vous en avez besoin:
la source
Pour plus d'informations sur
vous devriez vérifier Redux-Saga . Mais il est spécifique à votre choix de Redux comme cadre de modèle (bien que strictement non nécessaire).
la source