Kri*_*eck 9 javascript angular
NgZone中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
}
Run Code Online (Sandbox Code Playgroud)
我最好的猜测是,micro指的是来自特定类的任务,而macro可能指的是与整个应用程序相关的任务.有人可以验证或确认这个假设吗?或者说明具体细节?
NgZone文件:
https://angular.io/docs/ts/latest/api/core/index/NgZone-class.html#!#hasPendingMicrotasks-anchor
yur*_*zui 14
有三种任务
1)MicroTask:
微任务是在空堆栈帧上尽快执行的工作.保证在主机环境执行渲染或I/O操作之前运行微任务.在运行另一个MacroTask或EventTask之前,微任务队列必须为空.
即Promise.then()在微任务中执行
2)MacroTask
MacroTasks与主机环境的渲染和I/O操作交错.它们保证至少运行一次或取消(有些可以重复运行,如setInterval).宏任务具有隐含的执行顺序.
即setTimeout,setInterval,setImmediate
3)EventTask
EventTasks类似于宏任务,但与宏任务不同,它们可能永远不会运行.运行EventTask时,它会抢占下一个任务是宏任务队列的任何内容.事件任务不会创建队列.
即用户click,mousemove,XHR状态变化.
为什么知道当前是否正在执行任何任务是有用的?
知道任务何时执行且微任务队列为空,允许框架知道何时需要呈现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;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
也可以看看