javascript - hasPendingMacrotasks 和 hasPendingMicrotasks 检查什么?

标签 javascript angular

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)。宏任务有一个隐含的执行顺序。

setTimeoutsetIntervalsetImmediate

3) 事件任务

EventTasks 类似于宏任务,但与宏任务不同的是它们可能永远不会运行。当 EventTask 运行时,它会抢占宏任务队列中的任何下一个任务。事件任务不创建队列。

即用户 clickmousemoveXHR 状态改变。

为什么了解当前是否正在执行任何任务很有用?

  • 了解任务何时执行且微任务队列为空允许框架知道何时渲染 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

另见

关于javascript - hasPendingMacrotasks 和 hasPendingMicrotasks 检查什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43480595/

相关文章:

javascript - 动态创建的表格单元格在 Firefox 32.0 中不显示

javascript - 带有事件的嵌套元素

javascript - 如何在具有特定数据值的替代元素上应用 CSS?

javascript - 多个 innerHTML 函数

Angular 2 找不到在我的功能模块中声明的组件

angular - 从 url 中获取 id,其中参数位于路由 Angular 6 的中间

javascript - 在 React 中使用父 onClick 更改子类?

c# - 是否可以在长时间运行的请求中通过 ServiceStack 流式传输部分结果?

Angular Jest 或 Jasmine 测试 : How to Properly Spy/Mock a Static Object Called From Within a Tested Class?

angular - IntelliJ 错误地建议在 Angular 应用程序中将方法设为静态