Como o javascript em um navegador tem um único thread (exceto para webworkers que não estão envolvidos aqui) e um thread de execução do javascript é executado até a conclusão antes que outro possa ser executado, sua declaração:
while(flag==false) {}
será simplesmente executado para sempre (ou até que o navegador reclame sobre um loop de javascript não responsivo), a página parecerá estar travada e nenhum outro javascript terá a chance de ser executado, portanto, o valor do sinalizador nunca poderá ser alterado.
Para um pouco mais de explicação, Javascript é uma linguagem orientada a eventos . Isso significa que ele executa um fragmento de Javascript até retornar o controle ao interpretador. Então, somente quando retorna ao interpretador, Javascript obtém o próximo evento da fila de eventos e o executa.
Todas as coisas, como temporizadores e eventos de rede, passam pela fila de eventos. Portanto, quando um cronômetro dispara ou chega uma solicitação de rede, ele nunca "interrompe" o Javascript em execução no momento. Em vez disso, um evento é colocado na fila de eventos Javascript e, em seguida, quando o Javascript atualmente em execução termina, o próximo evento é retirado da fila de eventos e chega a sua vez de ser executado.
Portanto, quando você faz um loop infinito como while(flag==false) {}
, o Javascript em execução no momento nunca termina e, portanto, o próximo evento nunca é retirado da fila de eventos e, portanto, o valor de flag
nunca é alterado. A chave aqui é que o Javascript não é conduzido por interrupções . Quando um cronômetro dispara, ele não interrompe o Javascript em execução no momento, execute algum outro Javascript e, em seguida, deixe o Javascript em execução continuar. Ele apenas é colocado na fila de eventos esperando até que o Javascript atualmente em execução esteja pronto para ser executado.
O que você precisa fazer é repensar como seu código funciona e encontrar uma maneira diferente de acionar qualquer código que você deseja executar, quando o será executado no momento certo. Isso é muito, muito mais eficiente do que tentar usar algum tipo de cronômetro para verificar constantemente o valor do sinalizador.flag
valor mudar. Javascript é projetado como uma linguagem orientada a eventos. Então, o que você precisa fazer é descobrir em quais eventos você pode registrar um interesse para que possa ouvir o evento que pode causar a mudança do sinalizador e pode examinar o sinalizador nesse evento ou pode acionar seu próprio evento de qualquer código pode alterar o sinalizador ou você pode implementar uma função de retorno de chamada para que qualquer código que altere esse sinalizador possa chamar seu retorno de chamada sempre que o trecho de código responsável por alterar o valor do sinalizador altere seu valor para true
, ele apenas chama a função de retorno de chamada e, portanto, seu código que quer ser executado quando o sinalizador for definido paratrue
function codeThatMightChangeFlag(callback) {
// do a bunch of stuff
if (condition happens to change flag value) {
// call the callback to notify other code
callback();
}
}
jQuery.Deferred
,Q
,async
, ...