Что проверяет hasPendingMacrotasks и hasPendingMicrotasks?

в чем разница между hasPendingMacrotasks или hasPendingMicrotasks в пределах NgZone? В документации, как представляется, отсутствует информация. Все, что я знаю, это то, что они возвращают булево. Но что именно они проверяют? Что считается микро-задачей? А что считается макрозадачей?

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
}

мое лучшее предположение заключается в том, что micro относится к задачам из определенного класса, тогда как macro, вероятно, относится к задаче в отношении всего приложения. Может кто-нибудь проверить или подтвердить это предположение? Или пролить свет на детали?

Документы NgZone:

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

1 ответов


есть три вида задач

1) MicroTask:

в microtask-это работа, которая будет как можно скорее выполнять на пустой фрейм стека. Микрозадача гарантированно запускается до того, как среда хоста выполнит операции рендеринга или ввода-вывода. Перед запуском другой Макротаски или EventTask очередь микротаски должна быть пустой.

то есть Promise.then() выполняется в microtask

2) MacroTask

Макротаски чередуются с операциями рендеринга и ввода-вывода среды хоста. Они гарантированно запускаются хотя бы один раз или отменяются (некоторые могут выполняться повторно, например setInterval). Макрозадачи имеют подразумеваемый порядок выполнения.

то есть setTimeout, setInterval, setImmediate

3) EventTask

EventTasks похожи на задачи макросов, но в отличие от задач макросов они могут никогда не выполняться. Когда EventTask является запустите, он предварительно опустошает любую следующую задачу-очередь задач макросов. Задачи событий не создают очередь.

т. е. пользователь click, mousemove, XHR изменение состояния.

почему полезно знать, выполняются ли какие-либо из задач в настоящее время?

  • зная, когда задача выполняется и очереди microtask пустой базы позволяет узнать, когда пришло время для отрисовки пользовательского интерфейса.

  • отслеживание, когда все выполнение запланированных задач позволяет тестовой структуре знать, когда асинхронный тест завершен.

ng_zone.ТС

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

см. также