Para aqueles que desenvolvem aplicativos complexos, esteja ciente de que há um impacto no desempenho de sua escolha. Além disso, gostaria de completar a resposta do Mark com mais detalhes técnicos:
$ timeout (retorno de chamada) aguardará a conclusão do ciclo de resumo atual (ou seja, atualização angular de todo o modelo e do DOM), em seguida, executará seu retorno de chamada - afetando potencialmente o modelo angular - em seguida, lançará um full $apply
no escopo raiz do $ e redigirá tudo.
$ evalAsync (retorno de chamada) , por outro lado, adicionará o retorno de chamada ao ciclo de resumo atual ou próximo. O que significa que se você estiver dentro de um ciclo de resumo (por exemplo, em uma função chamada de alguma ng-click
diretiva), isso não esperará nada, o código será executado imediatamente. Se você estiver em uma chamada assíncrona, por exemplo setTimeout
, a, um novo ciclo de resumo ( $apply
) será acionado.
Portanto, em termos de desempenho, é sempre melhor chamar $evalAsync
, a menos que seja importante para você que a visualização esteja atualizada antes de executar seu código, por exemplo, se você precisar de acesso a algum atributo DOm, como largura dos elementos e afins.
Se você quiser obter mais detalhes sobre a distinção entre $ timeout, $ evalAsync, $ digest, $ apply, convido você a ler minha resposta nessa outra pergunta: https://stackoverflow.com/a/23102223/1501926
Leia também a documentação :
O $ evalAsync não garante quando a expressão será executada, apenas que:
- ele será executado após a função que agendou a avaliação (de preferência antes da renderização do DOM).
- pelo menos um ciclo $ digest será executado após a execução da expressão.
Nota: se essa função for chamada fora de um ciclo $ digest, um novo ciclo $ digest será agendado . No entanto, é recomendável sempre chamar o código que altera o modelo de dentro de uma chamada $ apply. Isso inclui código avaliado via $ evalAsync.