He estado usando AngularJS durante un tiempo, y he encontrado la necesidad de usar $ timeout de vez en cuando (parece ser que generalmente se inicia un complemento jQuery).
Recientemente, he estado tratando de obtener una comprensión mejor y más profunda del ciclo de resumen, y me encontré con la función $ evalAsync .
Parece que esa función produce resultados similares a $timeout
, solo que no le das retraso. Cada vez que lo he usado $timeout
ha sido con un retraso de 0, así que ahora me pregunto si debería haberlo usado $evalAsync
.
¿Hay alguna diferencia fundamental entre los dos? ¿Qué casos usarías uno sobre el otro? Me gustaría tener una mejor idea de cuándo usar cuál.
fuente
Para aquellos que crean aplicaciones complejas, tenga en cuenta que hay un impacto en el rendimiento de su elección. Además, me gustaría completar la respuesta de Mark con más detalles técnicos:
$ timeout (devolución de llamada) esperará a que se realice el ciclo de resumen actual (es decir, actualización angular de todos los modelos y DOM), luego ejecutará su devolución de llamada, que posiblemente afecte al modelo angular, y luego lanzará un completo
$apply
en la raíz $ alcance y redirigirá todo.$ evalAsync (devolución de llamada) , por otro lado, agregará la devolución de llamada al ciclo de resumen actual o siguiente. Lo que significa que si está dentro de un ciclo de resumen (por ejemplo, en una función llamada desde alguna
ng-click
directiva), esto no esperará nada, el código se ejecutará de inmediato. Si está dentro de una llamada asincrónica, por ejemplo asetTimeout
,$apply
se activará un nuevo ciclo de resumen ( ).Entonces, en términos de rendimiento, siempre es mejor llamar
$evalAsync
, a menos que sea importante para usted que la vista esté actualizada antes de ejecutar su código, por ejemplo, si necesita acceder a algún atributo DOm, como el ancho de los elementos y similares.Si desea más detalles sobre la distinción entre $ timeout, $ evalAsync, $ digest, $ apply, lo invito a leer mi respuesta sobre esa otra pregunta: https://stackoverflow.com/a/23102223/1501926
También asegúrese de leer la documentación :
fuente
x
desde su alcance directamente en lugar de desde el DOM, por lo que no tiene que esperar nada. Además, debería usarlo mejorng-style
con CSS en lugar de lawidth
propiedad obsoleta . Si necesita más ayuda, abra una nueva pregunta en StackOverflow.