hasPendingMacrotasks和hasPendingMicrotasks检查了什么?

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)

在此输入图像描述

也可以看看

  • 有没有办法取消zone.js中的宏任务和微任务? (3认同)