Comment Puis-Je Attendre Dans Le Noeud.js (Javascript), je dois faire une pause pendant un certain temps

je développe une console comme script pour mes besoins personnels... J'ai besoin de pouvoir faire une pause prolongée, mais en tant que noeud.js de mes recherches n'a aucun moyen de s'arrêter Comme requis.... Il devient difficile de lire les informations des utilisateurs après une période de temps... iv vu un peu de code, mais je crois qu'ils ont d'avoir d'autres codes à l'intérieur d'eux pour leur travail tels que:

setTimeout(function() {
}, 3000);

mais ce problème est, 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');
//endcode. 

j'ai aussi vu des choses comme

yield sleep(2000);

mais noeud.js ne le reconnaît pas....

Si quelqu'un est prêt à aider, il est très apprécié.

177
demandé sur Christopher Allen 2013-01-10 05:37:22

23 réponses

la meilleure façon de faire ceci est de casser votre code en plusieurs fonctions, comme ceci:

function function1() {
    // stuff you want to happen right away
    console.log('Welcome to My Console,');
}

function function2() {
    // all the stuff you want to happen after that pause
    console.log('Blah blah blah blah extra-blah');
}

// call the first chunk of code right away
function1();

// call the rest of the code and have it execute after 3 seconds
setTimeout(function2, 3000);

c'est similaire à JohnnyHK 's solution, mais beaucoup plus net et plus facile à étendre.

118
répondu Elliot Bonneville 2016-04-03 18:41:48

mettez le code que vous voulez exécuter après le délai dans le setTimeout callback:

console.log('Welcome to My Console,');
setTimeout(function() {
    console.log('Blah blah blah blah extra-blah');
}, 3000);
118
répondu JohnnyHK 2013-01-10 01:44:53

c'est une technique de blocage simple:

var waitTill = new Date(new Date().getTime() + seconds * 1000);
while(waitTill > new Date()){}

c'est blocage dans la mesure où rien d'autre n'arrivera dans votre script (comme des callbacks). Mais puisque c'est un script de console, peut-être que c'est ce dont vous avez besoin!

88
répondu atlex2 2016-06-01 17:51:08

vous pouvez utiliser ce www.npmjs.com/package/sleep

var sleep = require('sleep');
sleep.sleep(10); // sleep for ten seconds
45
répondu Aleksej 2016-04-22 17:40:54

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 suspension ou gen-run .

voici un exemple d'utilisation de la suspension:

suspend(function* () {
    console.log('Welcome to My Console,');
    yield setTimeout(suspend.resume(), 10000); // 10 seconds pass..
    console.log('Blah blah blah blah extra-blah');
})();

Liées à la lecture (par la voie de l'auto-promotion éhontée): Quel est le Big Deal avec des Générateurs? .

33
répondu jmar777 2015-04-23 05:32:59

fonction de sommeil simple et élégante utilisant Javascript moderne

function sleep(millis) {
    return new Promise(resolve => setTimeout(resolve, millis));
}

Pas de dépendance, pas de rappel de l'enfer; c'est tout :-)


compte tenu de l'exemple donné dans la question, voici comment nous attendrons entre deux consoles:

async function main() {
    console.log("Foo");
    await sleep(2000);
    console.log("Bar");
}

main();

l ' "inconvénient" est que votre fonction principale doit être async ainsi. Mais, considérant que vous écrivez déjà Javascript moderne code, vous devriez utiliser async / await partout dans votre code, donc ce n'est vraiment pas un problème. Tous les navigateurs modernes aujourd'hui prise en charge it.

donnant un petit aperçu de la fonction sleep pour ceux qui ne sont pas habitués à async/await , vous pouvez aussi l'écrire comme ceci:

async function sleep(millis) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () { resolve(); }, millis);
    });
}

en utilisant l'opérateur fat arrow, cependant, le rend encore plus petit (et plus élégant).

31
répondu Lucio Paiva 2018-08-20 14:33:29

la solution la plus courte sans aucune dépendance:

await new Promise(done => setTimeout(done, 5000));
17
répondu k06a 2018-03-06 20:47:32

j'ai récemment créé une abstraction plus simple appelée attendez.pour appeler les fonctions asynchrones en mode sync (basé sur les fibres des noeuds). Il existe également une version basée sur les générateurs ES6 à venir.

https://github.com/luciotato/waitfor

par attendre.pour , vous pouvez appeler n'importe quelle fonction async standard de nodejs, comme si c'était une fonction sync, sans bloquer la boucle d'événement de 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.

par attendre.pour votre code sera:

require('waitfor')

..in a fiber..
//start-of-code
console.log('Welcome to My Console,');
wait.miliseconds(10*1000); //defined in waitfor/paralell-tests.js - DOES NOT BLOCK
console.log('Blah blah blah blah extra-blah');
//endcode. 

N'importe quelle fonction async peut aussi être appelée en mode Sync . Vérifiez les exemples.

13
répondu Lucio M. Tato 2013-09-06 13:58:46

sur Linux / nodejs cela fonctionne pour moi:

const spawnSync = require('child_process').spawnSync;

var sommeil = spawnSync (en mode "veille", [1.5]);

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 les autres OS ont une commande similaire.

13
répondu Bart Verheijen 2016-11-18 18:50:04

je voulais un sommeil asynchrone qui fonctionnait sous Windows et Linux, sans encombrer mon CPU d'une longue boucle. J'ai essayé le sleep package mais il ne s'installait pas sur ma fenêtre. J'ai fini par utiliser:

https://www.npmjs.com/package/system-sleep

pour l'installer, tapez:

npm install system-sleep

dans votre code,

var sleep = require('system-sleep');
sleep(10*1000); // sleep for 10 seconds

Fonctionne comme un charme.

11
répondu Ryan Shillington 2017-01-13 18:56:36

si vous voulez "code golf" vous pouvez faire une version plus courte de certaines des autres réponses ici:

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

mais vraiment la réponse idéale à mon avis est D'utiliser la bibliothèque util de Node et sa fonction promisify , qui est conçu pour exactement ce genre de chose (faire des versions basées sur la promesse de choses existantes non basées sur la promesse): "15198090920"

const util = require('util');
const sleep = util.promisify(setTimeout);

dans les deux cas, vous pouvez ensuite faire une pause simplement en utilisant await pour appeler votre fonction sleep :

await sleep(1000); // sleep for 1s/1000ms
9
répondu machineghost 2017-10-24 00:38:40

puisque javascript engine (v8) exécute le code basé sur la séquence d'événements dans event-queue, il n'y a pas de restriction que javascript déclenche exactement l'exécution après l'heure spécifiée. C'est-à-dire que lorsque vous définissez quelques secondes pour exécuter le code plus tard, le code de déclenchement est purement de base sur la séquence dans la file d'événements. Ainsi, le déclenchement de l'exécution du code peut prendre plus de temps que spécifié.

Sorte De Nœud.js suit,

process.nextTick()

pour exécuter le code plus tard setTimeout (). Par exemple,

process.nextTick(function(){
    console.log("This will be printed later");
});
6
répondu HILARUDEEN ALLAUDEEN 2013-06-16 06:33:20

avec ES6 supportant Promise s, nous pouvons les utiliser sans aucune aide de tiers.

const sleep = (seconds) => {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, (seconds * 1000));
    });
};

// We are not using `reject` anywhere, but it is good to
// stick to standard signature.

alors utilisez - le comme ceci:

const waitThenDo(howLong, doWhat) => {
    return sleep(howLong).then(doWhat);
};

notez que la fonction doWhat devient le resolve callback dans le new Promise(...) .

notez aussi 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 avec l'aide de Reliures C++. (Bien que le besoin d'un sommeil bloquant dans les environnements asynchrones soit rare.)

https://github.com/erikdubbelboer/node-sleep

2
répondu treecoder 2017-07-31 23:27:13
let co = require('co');
const sleep = ms => new Promise(res => setTimeout(res, ms));

co(function*() {
    console.log('Welcome to My Console,');
    yield sleep(3000);
    console.log('Blah blah blah blah extra-blah');
});

ce code ci-dessus est l'effet secondaire de la résolution du problème 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, il s'agit de l'amélioration la plus passionnante introduit à Javascript moderne à mon avis. Pour bien comprendre comment cela fonctionne, il faut bien comprendre le fonctionnement du générateur. Le mot-clé function suivi d'un * est appelé une fonction de générateur dans moderne JavaScript. Le paquet npm co fournit une fonction runner pour faire fonctionner un générateur.

essentiellement fonction de générateur a fourni un moyen d'interrompre l'exécution d'une fonction avec 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 pour l'appelant pour extraire des données d'un promise d'un appel asynchrone et de passer la résolution données vers le générateur. Effectivement, il rend un appel asynchrone et synchrone.

1
répondu Elgs Qian Chen 2017-03-08 11:57:52

si vous avez juste besoin de suspendre pour tester l'exécution du thread, essayez ceci:

function longExecFunc(callback, count) {

    for (var j = 0; j < count; j++) {
        for (var i = 1; i < (1 << 30); i++) {
            var q = Math.sqrt(1 << 30);
        }
    }
    callback();
}
longExecFunc(() => { console.log('done!')}, 5); //5, 6 ... whatever. Higher -- longer
0
répondu Ivan Talalaev 2016-11-29 09:19:15

simple nous allons attendre 5 secondes pour qu'un événement se produise (qui serait indiqué par la variable done placée à true ailleurs dans le code) ou quand le délai expire que nous vérifierons tous les 100ms

    var timeout=5000; //will wait for 5 seconds or untildone
    var scope = this; //bind this to scope variable
    (function() {
        if (timeout<=0 || scope.done) //timeout expired or done
        {
            scope.callback();//some function to call after we are done
        }
        else
        {
            setTimeout(arguments.callee,100) //call itself again until done
            timeout -= 100;
        }
    })();
0
répondu Stan Sokolov 2017-03-22 14:54:04

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 ()?

var hello = "Hello World";
setTimeout(alert, 1000, hello); 

"bonjour" est le paramètre passé, vous pouvez passer tous les paramètres après la durée de temporisation. Merci à @Fabio Phms pour la réponse.

0
répondu Dazt 2017-05-23 12:18:24

regardez readline-sync ( https://www.npmjs.com/package/readline-sync )

installer avec npm install readline-sync

var readlineSync = require('readline-sync');
while(true) {
  var input = readlineSync.question("What is your input?");
  if(input === 'exit') {
    process.exit();
  } else {
    console.log("Your input was " + input);
  }
}

Peut-être pas la meilleure pratique, mais fait le travail pour moi

0
répondu MonoThreaded 2017-08-26 22:01:46

c'est un moment.module aromatisé js basé sur l'approche de blocage sale suggérée par @atlex2 . utilisez ceci seulement pour les essais .

const moment = require('moment');

let sleep = (secondsToSleep = 1) => {
    let sleepUntill = moment().add(secondsToSleep, 'seconds');
    while(moment().isBefore(sleepUntill)) { /* block the process */ }
}

module.exports = sleep;
0
répondu Boaz 2017-11-08 14:11:34

les autres réponses sont excellentes mais j'ai pensé que je prendrais un tact différent.

si tout ce que vous cherchez vraiment est de ralentir un fichier spécifique sous linux:

 rm slowfile; mkfifo slowfile; perl -e 'select STDOUT; $| = 1; while(<>) {print $_; sleep(1) if (($ii++ % 5) == 0); }' myfile > slowfile  &

node myprog slowfile

1 seconde toutes les 5 lignes. Le nœud programme, aussi lent que l'écrivain. Si elle fait autre chose, elle continuera à la vitesse normale.

le mkfifo crée un first-in-first-out tuyau. C'est ce qui rend ce travail. La ligne perl écrira aussi vite que vous le voulez. Le $ / =1 dit de ne pas amortir la sortie.

-1
répondu Pete 2017-08-05 14:24:14

pour plus d'informations sur

yield sleep(2000); 

vous devez cocher Redux-Saga . Mais il est spécifique à votre choix de Redux comme cadre Modèle (bien que strictement non nécessaire).

-2
répondu Arseni Buinitski 2016-09-09 09:24:46

j'ai assemblé, après avoir lu les réponses à cette question, une fonction simple qui peut aussi faire un rappel, si vous avez besoin de cela:

function waitFor(ms, cb) {
  var waitTill = new Date(new Date().getTime() + ms);
  while(waitTill > new Date()){};
  if (cb) {
    cb()
  } else {
   return true
  }
}
-2
répondu Netsi1964 2016-11-06 08:08:38