2017-04-18 72 views
5

NgZone中hasPendingMacrotasks或hasPendingMicrotasks有什麼區別?文件似乎缺乏信息。我所知道的是他們返回一個布爾值。但他們究竟在檢查什麼?什麼被認爲是一項微觀任務?什麼被認爲是一項宏觀任務?hasPendingMacrotasks和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 
} 

我最好的猜測是,微指任務從一個特定的類中,而宏觀大概是指一個任務在關於整個應用程序。任何人都可以驗證或確認這個假設?或者說明一些細節?

NgZone文檔:

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

回答

5

有三種任務

1)MicroTask的:

一個microtask是會盡快執行工作可能在空棧幀。微控制器保證在主機環境執行渲染或I/O操作之前運行。在另一個MacroTask或EventTask運行之前,微任務隊列必須是空的。

Promise.then()執行microtask

2)宏任務

宏任務被交錯以再現和宿主環境的I/O操作。他們保證至少運行一次或取消(有些可以重複運行,如setInterval)。宏任務具有隱含的執行順序。

setTimeoutsetIntervalsetImmediate

3)EventTask

EventTasks類似於宏的任務,但與宏觀的任務,他們可能永遠不會運行。當一個EventTask運行時,它會搶佔任何下一個任務是宏任務隊列。事件任務不會創建隊列。

即用戶click,mousemove,XHR狀態改變。

爲什麼知道是否有任何任務正在執行?

  • 當任務已執行和microtask隊列爲空知道允許的框架知道什麼時候是時候來渲染UI。

  • 執行所有計劃任務時的跟蹤允許測試框架知道異步測試何時完成。

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

+1

見謝謝你這有助於明確一些事情了。 –