NgZone 中的 hasPendingMacrotasks 和 hasPendingMicrotasks 有什么区别?文档似乎缺少信息。我所知道的是他们返回一个 bool 值。但他们到底在检查什么?什么是微任务?什么是宏任务?
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
最佳答案
一共有三种任务
1)微任务:
微任务是在空栈帧上尽快执行的工作。微任务保证在主机环境执行渲染或 I/O 操作之前运行。在另一个 MacroTask 或 EventTask 运行之前,微任务队列必须为空。
即Promise.then()
在微任务中执行
2) 宏任务
宏任务与宿主环境的渲染和 I/O 操作交织在一起。它们保证至少运行一次或取消(有些可以重复运行,例如 setInterval
)。宏任务有一个隐含的执行顺序。
即setTimeout
、setInterval
、setImmediate
3) 事件任务
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;
}
}
}
}
}
另见
关于javascript - hasPendingMacrotasks 和 hasPendingMicrotasks 检查什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43480595/