¿Cuál es la diferencia entre hasPendingMacrotasks o hasPendingMicrotasks dentro de NgZone? La documentación parece carecer de información. Todo lo que sé es que devuelven un valor booleano. Pero, ¿qué están buscando exactamente? ¿Qué se considera una microtarea? ¿Y qué se considera una tarea macro?
class NgZone { static isInAngularZone() : boolean static assertInAngularZone() : void static assertNotInAngularZone() : void constructor({enableLongStackTrace = false}: any) run(fn: () => any) : any runGuarded(fn: () => any) : any runOutsideAngular(fn: () => any) : any onUnstable : EventEmitter<any> onMicrotaskEmpty : EventEmitter<any> onStable : EventEmitter<any> onError : EventEmitter<any> isStable : boolean hasPendingMicrotasks : boolean hasPendingMacrotasks : boolean }Mi mejor suposición es que micro se refiere a tareas dentro de una clase específica, mientras que macro probablemente se refiere a una tarea con respecto a toda la aplicación. ¿Alguien puede verificar o confirmar esta suposición? ¿O arrojar algo de luz sobre los detalles?
Documentos de NgZone:
https://angular.io/docs/ts/latest/api/core/index/NgZone-class.html#!#hasPendingMicrotasks-anchor
Hay tres tipos de tareas
1) Microtarea :
Una microtarea es un trabajo que se ejecutará lo antes posible en un marco de pila vacío. Se garantiza que una microtarea se ejecutará antes de que el entorno host realice la representación o las operaciones de E/S. Una cola de microtareas debe estar vacía antes de que se ejecute otra MacroTask o EventTask.
es decir Promise.then() ejecuta en microtarea
2) Macrotarea
Las macrotareas se intercalan con las operaciones de procesamiento y E/S del entorno del host. Se garantiza que se ejecutarán al menos una vez o se cancelarán (algunos pueden ejecutarse repetidamente, como setInterval ). Las tareas de macro tienen un orden de ejecución implícito.
es decir, setTimeout , setInterval , setImmediate
3) Tarea de evento
EventTasks son similares a las tareas de macro, pero a diferencia de las tareas de macro, es posible que nunca se ejecuten. Cuando se ejecuta una EventTask, se adelanta a la siguiente tarea que sea la cola de tareas macro. Las tareas de eventos no crean una cola.
es decir, click del usuario, mousemove , cambio de estado XHR .
¿Por qué es útil saber si alguna de las tareas se está realizando actualmente?
Saber cuándo se ha ejecutado una tarea y una cola de microtareas está vacía permite que los marcos sepan cuándo es el momento de representar la interfaz de usuario.
El seguimiento de cuándo se ejecutan todas las tareas programadas permite que un marco de prueba sepa cuándo se ha completado una prueba asíncrona.
ng_zone.ts
private checkStable() { if (this._nesting == 0 && !this._hasPendingMicrotasks && !this._isStable) { try { this._nesting++; this._onMicrotaskEmpty.emit(null); } finally { this._nesting--; if (!this._hasPendingMicrotasks) { try { this.runOutsideAngular(() => this._onStable.emit(null)); } finally { this._isStable = true; } } } } }Ver también