2017-04-18 7 views
5

Jaka jest różnica między hasPendingMacrotasks lub hasPendingMicrotasks within NgZone? Wydaje się, że w dokumentacji brakuje informacji. Wiem tylko, że zwracają wartość boolowską. Ale co dokładnie sprawdzają? Co uważa się za mikro zadanie? A co jest uważane za zadanie makro?Co sprawdza opcja hasPendingMacrotasks i hasPendingMicrotasks?

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 
} 

Mój najlepszy przypuszczenie to, że mikro odnosi się do zadań z poziomu konkretnej klasy natomiast makro prawdopodobnie odnosi się do zadania w odniesieniu do całej aplikacji. Czy ktokolwiek może zweryfikować lub potwierdzić to założenie? A może rzucić trochę światła na szczegóły?

NgZone Docs:

https://angular.io/docs/ts/latest/api/core/index/NgZone-class.html#!#hasPendingMicrotasks-anchor

Odpowiedz

5

Istnieją trzy rodzaje zadań

1) MicroTask:

microtask jest praca, która będzie wykonywać jak najszybciej możliwe na pustej ramie stosu. Przed uruchomieniem renderowania lub operacji we/wy gwarantuje się uruchomienie mikropaskowania. Kolejka microtask musi być pusta przed uruchomieniem innego zadania MacroTask lub EventTask.

tj Promise.then() wykonuje się microtask

2) MacroTask

MacroTasks są przeplatane renderowania i operacji I/O środowiska docelowego. Gwarantujemy, że zostaną uruchomione co najmniej raz lub anulowane (niektóre mogą działać wielokrotnie, np. setInterval). Zadania makr mają domyślną kolejność wykonywania.

tj setTimeout, setInterval, setImmediate

3) EventTask

EventTasks są podobne do zadań makro, ale w przeciwieństwie do zadań makro mogą nie działać. Kiedy uruchamiana jest EventTask, poprzedza to, co następne zadanie jest kolejką zadań makr. Zadania zdarzeń nie tworzą kolejki.

, tj. Użytkownik click, mousemove, XHR zmiana stanu.

Dlaczego warto wiedzieć, czy któreś z zadań jest obecnie wykonywane?

  • Wiedząc, gdy zadanie jest wykonywane, a kolejka jest pusta microtask ramy pozwala wiedzieć, kiedy jest czas, aby uczynić UI.

  • Śledzenie, kiedy wszystkie zaplanowane zadania są wykonywane, pozwala ramie testowej wiedzieć, kiedy zakończył się test asynchroniczny.

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; 
     } 
     } 
    } 
    } 
} 

enter image description here

Zobacz także

+1

Dziękuję pomaga usunąć niektóre rzeczy. –