Esta função abaixo não funciona como eu quero; sendo um novato em JS, não consigo entender o porquê.
Eu preciso esperar 5 segundos antes de verificar se newState
é -1
.
Atualmente, ele não espera, apenas verifica imediatamente.
function stateChange(newState) {
setTimeout('', 5000);
if(newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
javascript
dom-events
copyflake
fonte
fonte
Respostas:
Você deve inserir seu código na função de retorno de chamada fornecida para
setTimeout
:Qualquer outro código será executado imediatamente.
fonte
Você realmente não deveria estar fazendo isso , o uso correto do tempo limite é a ferramenta certa para o problema do OP e em qualquer outra ocasião em que você queira executar algo após um período de tempo. Joseph Silber demonstrou isso bem em sua resposta. No entanto, se, em alguns casos de não produção, você realmente quiser travar o encadeamento principal por um período de tempo, isso será possível.
Com execução no formato:
Cheguei aqui porque estava construindo um caso de teste simples para sequenciar uma mistura de operações assíncronas em torno de operações de bloqueio de longa execução (ou seja, manipulação cara do DOM) e esta é a minha operação de bloqueio simulada. Como esse trabalho é adequado, pensei em publicá-lo para qualquer pessoa que chegar aqui com um caso de uso semelhante. Mesmo assim, ele está criando um objeto Date () em um loop while, o que pode sobrecarregar o GC se ele for executado por tempo suficiente. Mas não posso enfatizar o suficiente, isso é adequado apenas para testes, para criar qualquer funcionalidade real, você deve consultar a resposta de Joseph Silber.
fonte
Aqui está uma solução usando a nova sintaxe assíncrona / aguardada .
Verifique o suporte ao navegador, pois esse é um novo recurso introduzido no ECMAScript 6.
Função útil:
Uso:
A vantagem dessa abordagem é que ela faz seu código parecer e se comportar como código síncrono.
fonte
Use uma função de atraso como esta:
Uso:
Créditos: como atrasar o manipulador .keyup () até que o usuário pare de digitar?
fonte
Você não deve apenas tentar pausar 5 segundos em javascript. Não é assim que funciona. Você pode agendar uma função do código para ser executada em 5 segundos a partir de agora, mas é necessário colocar o código que deseja executar posteriormente em uma função e o restante do seu código após essa função continuará sendo executado imediatamente.
Por exemplo:
Mas, se você tiver um código como este:
A
console.log()
declaração será executada imediatamente. Ele não irá esperar até que o tempo limite seja acionado nastateChange()
função. Você não pode simplesmente pausar a execução do javascript por um tempo predeterminado.Em vez disso, qualquer código que você deseja executar atrasos deve estar dentro da
setTimeout()
função de retorno de chamada (ou chamado a partir dessa função).Se você tentou "pausar" fazendo um loop, basicamente "travou" o intérprete Javascript por um período de tempo. Como o Javascript executa seu código em apenas um único encadeamento, quando você faz um loop, nada mais pode ser executado (nenhum outro manipulador de eventos pode ser chamado). Portanto, aguardar repetidamente a alteração de uma variável nunca funcionará porque nenhum outro código pode ser executado para alterar essa variável.
fonte
var t = new Date().getTime(); while (new Date().getTime() < t + millisecondsToLockupBrowser);
Se você estiver em uma função assíncrona, basta fazê-lo em uma linha:
Observe que se o destino for NodeJS, será mais eficiente usá-lo (é uma função setTimeout prometida predefinida):
fonte
Tente o seguinte:
fonte
A melhor maneira de criar uma função como esta para aguardar em mili segundos, esta função aguardará os milissegundos fornecidos no argumento:
fonte
Com base na resposta de Joseph Silber , eu faria assim, um pouco mais genérico.
Você teria sua função (vamos criar uma com base na pergunta):
E você pode ter uma função de espera:
No final, você teria:
Essa é uma solução, prefiro não usar argumentos na função de espera (para ter apenas em
foo();
vez defoo(arg);
), mas é por exemplo.fonte
Esta solução vem da documentação do React Native para um controle de atualização :
Para aplicar isso à pergunta do OP, você pode usar esta função em coordenação com
await
:fonte
Você pode adicionar atraso fazendo pequenas alterações em sua função (assíncrona e aguardando).
fonte
usando angularjs:
fonte
Criar nova função Js
Chame a função quando quiser atrasar a execução. Use milissegundos em int para o valor do atraso.
fonte
Eu usei para rodar jogos de PC a partir do Edge ou IE. E fecha automaticamente o IE Edge após 7 segundos.
Firefox e Google Chrome não podem ser usados para iniciar jogos dessa maneira.
fonte