Existe uma maneira de eu dormir no JavaScript antes de executar outra ação?
Exemplo:
var a = 1+3;
// Sleep 3 seconds before the next action here
var b = a + 4;
javascript
sleep
Jin Yong
fonte
fonte
Caso você realmente precise de
sleep()
apenas um teste. Mas lembre-se de que ele travará o navegador na maioria das vezes durante a depuração - provavelmente é por isso que você precisa. No modo de produção, comentarei esta função.Não use
new Date()
em loop, a menos que queira desperdiçar memória, energia de processamento, bateria e possivelmente a vida útil do seu dispositivo.fonte
Versão ECMAScript 6, usando geradores com rendimento para "bloqueio de código":
Como a pergunta original foi publicada há sete anos, eu não me incomodei em responder com o código exato, porque é muito fácil e já foi respondido. Isso deve ajudar em problemas mais complicados, como se você precisar de pelo menos dois inativos ou se planeja sequenciar a execução assíncrona. Sinta-se livre para modificá-lo para atender às suas necessidades.
função*
() => função da seta
Você também pode encadear eventos via Promises :
Ou muito mais simples e menos sofisticado seria
Se você está apenas esperando que alguma condição aconteça, pode esperar assim
fonte
Atualização de 2018
Os últimos Safari, Firefox e Node.js agora também oferecem suporte a async / waitit / promises.
Usando async / waitit / Promises:
(A partir de 1/2017, com suporte no Chrome, mas não no Safari, Internet Explorer, Firefox, Node.js)
Atualização de 2017
O JavaScript evoluiu desde que essa pergunta foi feita e agora possui funções geradoras, e o novo async / waitit / Promise está sendo lançado.
Abaixo, há duas soluções, uma com função de gerador que funcionará em todos os navegadores modernos e outra, usando o novo async / waitit que ainda não é suportado em todos os lugares.Usando uma função de gerador:
Preste atenção ao fato de que essas duas soluções são de natureza assíncrona. Isso significa que o myAsyncFunc (em ambos os casos) retornará durante o sono.
É importante observar que esta pergunta é diferente de Qual é a versão JavaScript do sleep ()? onde o solicitante está solicitando uma suspensão real (nenhuma outra execução de código no processo), em vez de um atraso entre as ações.
fonte
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(); };
permitiria que vocêlet asyncAdd = co(function* (a, b) { console.log('Sleeping'); yield sleep(3000); console.log('Done'); return a + b; }); asyncAdd(3, 4).then(console.log);
usasse a definição desleep()
do seu segundo bloco de código.Se você deseja menos funções desajeitadas que
setTimeout
esetInterval
, pode envolvê-las em funções que apenas invertem a ordem dos argumentos e lhes dão nomes agradáveis:Versões do CoffeeScript:
Você pode usá-los perfeitamente com funções anônimas:
Agora, lê-se facilmente como "após N milissegundos ..." (ou "a cada N milissegundo ...")
fonte
Outra maneira de fazer isso é usando Promise e setTimeout (observe que você precisa estar dentro de uma função e configurá-la como assíncrona com a palavra-chave async):
fonte
Aqui está uma maneira muito simples de fazê-lo que "parece" uma pausa / suspensão síncrona, mas é um código js assíncrono legítimo.
fonte
Você pode usar javascript simples, isso chamará sua função / método após 5 segundos:
fonte
Existem várias maneiras de resolver esse problema. Se usarmos a
setTimeout
função, vamos conhecê-la primeiro. Esta função possui três parâmetros:function
oucode
,delay
(em milissegundos) e oparameters
. Como a função ou o parâmetro de código é necessário, os outros são opcionais. Depois de não ter inserido o atraso , ele será definido como zero.Para mais detalhes sobre a
setTimeout()
ir para este link .Versão simplificada:
Usando o parâmetro pass:
Suporte do navegador:
fonte
Este é o meu modelo que mostra como "dormir" ou "DoEvents" em javascript usando uma função geradora (ES6). Código comentado:
fonte
Tente esta função:
Aqui está como você o usa:
Ou vá com estilo promissor:
Aqui está uma demonstração .
fonte