Como Posso Esperar No Nó?js (Javascript), preciso de pausar por um período de tempo

Estou a desenvolver uma consola como script para necessidades pessoais... Preciso de fazer uma pausa por um longo período de tempo, mas como nó.js da minha pesquisa não tem como parar conforme necessário.... Está ficando difícil de ler informações de usuários após um período de tempo... vi alguns códigos lá fora, mas acredito que eles têm que ter outros códigos dentro deles para que eles funcionem, tais como:

setTimeout(function() {
}, 3000);
Mas esta questão é que preciso de tudo depois desta linha de código para executar após o período de tempo...

por exemplo,

//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. 

também vi coisas como

yield sleep(2000);

mas nó.o js não reconhece isto....

Se alguém está disposto a ajudar, é muito apreciado.

Author: Christopher Allen, 2013-01-10

23 answers

A melhor maneira de fazer isto é quebrar o seu código em múltiplas funções, assim:

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);

É semelhante à solução deJohnnyHK , mas muito mais clara e mais fácil de estender.

 118
Author: Elliot Bonneville, 2016-04-03 18:41:48

Coloque o código que deseja executar após o atraso no callback setTimeout:

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

Esta é uma técnica de bloqueio simples:

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

É Bloqueio {[[6]} na medida em que nada mais vai acontecer no seu script (como callbacks). Mas como este é um script de console, talvez seja o que você precisa!

 88
Author: atlex2, 2016-06-01 17:51:08

Pode usar este www.npmjs.com/package/sleep

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

Esta questão é bastante antiga, mas recentemente o V8 adicionou geradores que podem realizar o que a operação pediu. Os geradores são geralmente mais fáceis de usar nas interações de async com a assistência de uma biblioteca como suspender ou Gen-run.

Aqui está um exemplo usando suspender:

suspend(function* () {
    console.log('Welcome to My Console,');
    yield setTimeout(suspend.resume(), 10000); // 10 seconds pass..
    console.log('Blah blah blah blah extra-blah');
})();
Qual é o problema com os geradores?.
 33
Author: jmar777, 2015-04-23 05:32:59

Função de sono simples e elegante usando Javascript moderno

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

Sem dependências, sem inferno de retorno; é isso: -)


Considerando o exemplo dado na pergunta, é assim que vamos esperar entre dois registos de consola:

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

main();

A "desvantagem" é que a sua função principal também tem de ser async. Mas, considerando que você já está escrevendo código Javascript moderno, você deve estar usando async/await em todo o seu código, então isto não é um problema. Todo os navegadores modernos apoiam-no.

Dando uma pequena visão sobre a função sleep para aqueles que não estão acostumados a async/await, Você também poderia escrevê-la assim:

async function sleep(millis) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () { resolve(); }, millis);
    });
}
No entanto, a utilização do operador fat arrow torna-o ainda mais pequeno (e mais elegante).
 31
Author: Lucio Paiva, 2018-08-20 14:33:29

A solução mais curta sem dependências:

await new Promise(done => setTimeout(done, 5000));
 17
Author: k06a, 2018-03-06 20:47:32
Recentemente criei uma abstração mais simples chamada espera.for to call async functions in sync mode (based on node-fibers). Há também uma versão baseada em futuros geradores ES6.

Https://github.com/luciotato/waitfor

Usando Espere.para , você pode chamar qualquer função normal nodejs async, como se fosse uma função de sincronização, sem bloquear o loop de eventos do nó.

Podes codificar sequencialmente quando precisas, o que é perfeito. para simplificar seus scripts para uso pessoal.

Usando Espere.para o seu código será:

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. 

Também qualquer função async pode ser chamada no modo Sync. Veja os exemplos.

 13
Author: Lucio M. Tato, 2013-09-06 13:58:46

No Linux / nodejs isto funciona para mim:

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

Var sleep = spawnSync ('sleep', [1.5]);

Está a bloquear, mas não é um ciclo de espera ocupado.

O tempo que indica é em segundos, mas pode ser uma fracção. Não sei se os outros SO têm um comando semelhante.

 13
Author: Bart Verheijen, 2016-11-18 18:50:04
Eu queria um sono assíncrono que funcionasse no Windows & Linux, sem monopolizar a minha CPU com um loop longo. Tentei o pacote do sono, mas não instalou na minha caixa do Windows. Acabei por usar:

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

Para o instalar, escreva:

npm install system-sleep

No seu código,

var sleep = require('system-sleep');
sleep(10*1000); // sleep for 10 seconds
Funciona lindamente.
 11
Author: Ryan Shillington, 2017-01-13 18:56:36

Se você quiser "code golf" você pode fazer uma versão mais curta de algumas das outras respostas aqui:

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

Mas realmente a resposta ideal na minha opinião é usar a biblioteca do Node util e a sua função promisify, que é desenhada para exactamente este tipo de coisa (fazendo versões baseadas em promessas de coisas anteriormente existentes não baseadas em promessas):

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

Em qualquer dos casos, pode então fazer uma pausa simplesmente usando await para chamar a sua função sleep:

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

Uma vez que, javascript engine (v8) executa código baseado na sequência de eventos na fila de eventos, não há nenhum estrito que javascript exatamente despoleta a execução após a hora especificada. Isto é, quando você definir alguns segundos para executar o código mais tarde, o código de ativação é puramente base na sequência na fila de eventos. Assim, desencadear a execução do código pode demorar mais do que o tempo especificado.

So Node.js follows,

process.nextTick()

Para executar o código mais tarde em vez de setTimeout (). Por exemplo,

process.nextTick(function(){
    console.log("This will be printed later");
});
 6
Author: HILARUDEEN ALLAUDEEN, 2013-06-16 06:33:20
Com o apoio do ES6, podemos usá-los sem ajuda de terceiros.
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.

Então usa - o assim:

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

Note que a função doWhat torna-se a resposta resolve dentro do new Promise(...).

Note também que este é o sono assíncrono. Não bloqueia o circuito do evento. Se precisar de bloquear o sono, use esta biblioteca que percebe o bloqueio do sono com a ajuda de combinações de C++. (Embora a necessidade de um bloqueio de sono no nó como ambientes async é raro.)

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

 2
Author: 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');
});

Este código acima é o efeito colateral da resolução do problema assíncrono do inferno de callback do Javascript. Esta é também a razão que eu acho que faz Javascript uma linguagem útil na infra-estrutura. Na verdade, esta é a melhoria mais emocionante introduzida ao Javascript moderno na minha opinião. Para entender completamente como funciona, como o gerador funciona precisa ser totalmente compreendido. A palavra-chave function seguida por uma * é chamada de função gerador em Javascript moderno. O pacote npm co forneceu uma função de corredor para executar um gerador.

Essencialmente a função do gerador forneceu uma forma de pausar a execução de uma função com yield palavra-chave, ao mesmo tempo, yield numa função do gerador tornou possível a troca de informações entre o interior do gerador e o chamador. Isto forneceu um mecanismo para a pessoa que ligou extrair dados de uma chamada assíncrona e passar os dados resolvidos de volta para o gerador. Efectivamente, faz uma chamada assíncrona Sincrono.

 1
Author: Elgs Qian Chen, 2017-03-08 11:57:52

Se só precisa de suspender para fins de teste, a execução actual do tópico tente isto:

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
Author: Ivan Talalaev, 2016-11-29 09:19:15

Simples, vamos aguardar 5 segundos para algum evento acontecer (que seria indicado pelo feito variável definida como true em algum outro lugar do código) ou quando o tempo limite expira que iremos verificar cada 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
Author: Stan Sokolov, 2017-03-22 14:54:04

Para algumas pessoas, a resposta aceite não está a funcionar, encontrei esta outra resposta e está a funcionar para mim: Como posso passar um parâmetro a uma chamada de setTimeout ()?

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

'hello' é o parâmetro que está sendo passado, você pode passar todos os parâmetros após o tempo-limite. Obrigado a @Fabio Phms pela resposta.

 0
Author: Dazt, 2017-05-23 12:18:24
Dá uma vista de olhos ao readline-sync ([4]} https://www.npmjs.com/package/readline-sync)

Instalar com 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);
  }
}

Talvez não seja a melhor prática, mas faz o trabalho para mim

 0
Author: MonoThreaded, 2017-08-26 22:01:46
Isto é um momento.módulo com sabor js baseado na abordagem de bloqueio Sujo sugerida por @atlex2 . Use isto apenas para testar .
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
Author: Boaz, 2017-11-08 14:11:34
As outras respostas são óptimas, mas pensei em usar um tacto diferente.

Se tudo o que realmente procura é abrandar um ficheiro específico no linux:

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

Nó myprog slowfile

Isto vai dormir um segundo a cada cinco linhas. O programa de nó irá tão lento como o escritor. Se ele está fazendo outras coisas, eles continuarão a velocidade normal.

O mkfifo cria um tubo de primeira entrada-primeira saída. É o que faz isto funcionar. A linha perl irá escrever tão rápido quanto você querer. O $|=1 diz para não amortecer a saída.

 -1
Author: Pete, 2017-08-05 14:24:14

Para mais informações sobre

yield sleep(2000); 

Devias verificar Redux-Saga. Mas é específico para a sua escolha de Redux como seu modelo framework (embora estritamente não necessário).

 -2
Author: Arseni Buinitski, 2016-09-09 09:24:46

Eu juntei, depois de ter lido as respostas nesta pergunta, uma função simples que também pode fazer um callback, se você precisar disso:

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