Gostaria de adicionar um atraso / suspensão dentro de um while
loop:
Eu tentei assim:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
Somente o primeiro cenário é verdadeiro: após a exibição alert('hi')
, ele estará aguardando 3 segundos e alert('hello')
será exibido, mas alert('hello')
será repetidamente constantemente.
O que eu gostaria é que depois alert('hello')
seja mostrado 3 segundos depois alert('hi')
, ele precisará aguardar 3 segundos pela segunda vez alert('hello')
e assim por diante.
fonte
for in
loop?Object.keys()
setTimeout
comsetInterval
. Os tempos limites são implicitamente destruídos quando o retorno de chamada é chamado.Tente algo como isto:
fonte
Se estiver usando o ES6, você poderá usar
let
isso para:O que
let
faz é declarari
para cada iteração , não o loop. Dessa forma, o que é passadosetTimeout
é exatamente o que queremos.fonte
i*3000
argumento, dentro do loop, e o passasetTimeout
por valor. O uso delet
é opcional e não está relacionado ao questionário e à resposta.i < 10
), para que você tenha vários timers trabalhando em paralelo, o que cria alocação de memória e é pior em uma quantidade maior de iterações.Como o ES7 existe uma maneira melhor de aguardar um loop:
Quando o mecanismo atinge a
await
peça, ele define um tempo limite e interrompe a execução doasync function
. Então, quando o tempo limite terminar, a execução continuará nesse ponto. Isso é bastante útil, pois você pode atrasar (1) loops aninhados, (2) condicionalmente, (3) funções aninhadas:Referência no MDN
Embora o ES7 agora seja suportado pelo NodeJS e navegadores modernos, convém transpilar com o BabelJS para que ele seja executado em qualquer lugar.
fonte
break;
talvez?Outra maneira é multiplicar o tempo limite, mas observe que isso não é como dormir . O código após o loop será executado imediatamente, apenas a execução da função de retorno de chamada é adiada.
O primeiro tempo limite será definido como
3000 * 1
, o segundo3000 * 2
e assim por diante.fonte
start
dentro de sua função usando este método.Isso vai funcionar
Experimente este violino: https://jsfiddle.net/wgdx8zqq/
fonte
$.Deferred
mas foi um cenário diferente para deixar funcionou, polegar pra você ..!Eu acho que você precisa de algo assim:
Código do teste:
Nota: o uso de alertas interrompe a execução do javascript até você fechar o alerta. Pode ser mais código do que você solicitou, mas esta é uma solução reutilizável robusta.
fonte
Eu provavelmente usaria
setInteval
. Como isso,fonte
SetInterval()
continua gerando 'threads', mesmo no caso de algum erro ou bloco.No ES6 (ECMAScript 2015), você pode iterar com atraso com gerador e intervalo.
Exemplo de código:
Portanto, se você estiver usando o ES6, essa é a maneira mais elegante de obter um loop com atraso (na minha opinião).
fonte
Você pode usar o operador de intervalo RxJS . O intervalo emite número inteiro a cada x número de segundos e take é especificar o número de vezes que ele deve emitir números
fonte
Só pensei em postar meus dois centavos aqui também. Esta função executa um loop iterativo com um atraso. Veja este jsfiddle . A função é a seguinte:
Por exemplo:
Seria equivalente a:
fonte
Eu faço isso com Bluebird
Promise.delay
e recursão.fonte
No ES6, você pode fazer o seguinte:
No ES5, você pode fazer o seguinte:
O motivo é que
let
permite declarar variáveis limitadas ao escopo de uma instrução de bloco ou expressão na qual ela é usada, diferentemente davar
palavra - chave, que define uma variável globalmente ou localmente para uma função inteira, independentemente do escopo do bloco.fonte
Mostrar snippet de código
Uma versão modificada da resposta de Daniel Vassallo, com variáveis extraídas em parâmetros para tornar a função mais reutilizável:
Primeiro vamos definir algumas variáveis essenciais:
Em seguida, você deve definir a função que deseja executar. Isso será passado para i, o índice atual do loop e o comprimento do loop, caso você precise:
Versão auto-executável
Versão funcional
fonte
fonte
Faz você:
fonte
fonte
Aqui está como eu criei um loop infinito com um atraso que quebra em uma determinada condição:
A chave aqui é criar uma nova promessa que resolve por tempo limite e aguardar sua resolução.
Obviamente, você precisa de suporte assíncrono / aguardado para isso. Funciona no nó 8.
fonte
para uso comum "esqueça os loops normais" e use essa combinação de "setInterval" que inclui "setTimeOut" s: assim (das minhas tarefas reais).
PS: Entenda que o comportamento real de (setTimeOut): todos eles começarão no mesmo tempo "os três bla bla bla começarão a contagem regressiva no mesmo momento", então faça um tempo limite diferente para organizar a execução.
PS 2: o exemplo do loop de temporização, mas para os loops de reação, você pode usar eventos, prometer assíncrono aguardar.
fonte
fonte
Que eu saiba, a
setTimeout
função é chamada de forma assíncrona. O que você pode fazer é agrupar todo o loop em uma função assíncrona e aguardar umPromise
que contenha o setTimeout, como mostrado:E então você chama de executá-lo assim:
Reserve um tempo para entender bem a programação assíncrona.
fonte
Apenas tente isso
Resultado
fonte
Aqui está uma função que eu uso para fazer loop sobre uma matriz:
Você o usa assim:
fonte
Este script funciona para a maioria das coisas
fonte
Tente isso ...
fonte
Implementação simples de mostrar um pedaço de texto a cada dois segundos, enquanto o loop estiver em execução.
fonte
Tente isto
fonte