Что такое ZoneAwarePromise - PullRequest
       12

Что такое ZoneAwarePromise

0 голосов
/ 18 сентября 2018

Я использую Angular 6. Один из вызовов http возвращает ZoneAwarePromise, когда я пытаюсь преобразовать Observable в Promise.Также не вызывается блок then.

const login = this.authService.login(email, password).toPromise()
login.then(() => {\* not getting called*\})

Может кто-нибудь объяснить, что такое ZoneAwarePromise?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Promise - это конструктор, который во время выполнения в браузере преобразуется в ZoneAwarePromise() из zone.js.Пожалуйста, посетите следующую ссылку , чтобы узнать больше.

0 голосов
/ 18 сентября 2018

Мы используем Angular, потому что мы можем только изменить модель, и он автоматически обновит представление для нас на основе декларативных шаблонов, которые мы предоставляем через метаданные.

Способ, которым Angular обрабатывает это, перехватывая три типа событий:

  • пользовательских событий (например, щелчков),
  • часов (setTimeout, setInterval) и
  • сети (fetch, XHR, HttpClient).

В целом, это делается через зоны .Когда вы загружаете setTimeout, он на самом деле заменяет реализацию setTimeout по умолчанию на собственную реализацию, но с той же сигнатурой.Когда вы звоните setTimeout, вы даже не знаете, что используете зоны.

На очень высоком уровне это работает примерно так:

const originalSetTimeout = window.setTimeout
window.setTimeout = (fn, time) => {
  setTimeout(() => { fn(); updateView() }, time)
}

Этов основном просто выполняет вашу функцию как обычно, а затем вызывает другую вещь - которая используется Angular для обновления представления.

ZoneAwarePromise - это просто способ использования Promise, так что зона будет осознавать это .Вы можете найти детали реализации в исходном коде Zone.js, но в этом суть.

0 голосов
/ 18 сентября 2018

Angular сильно зависит от zone.js для сохранения контекста выполнения в асинхронных задачах.Он заключен в инъецируемую службу, называемую NgZone.

. Эти зоны обертывают общие объекты JS, предназначенные для запуска асинхронных задач, в том числе Promises.Это поддерживается в Zone как Task, MicroTask и т. Д.

A ZoneAwarePromise все еще функционально идентичен обычному Promise, но внутренне остается осведомленным о контексте выполнения Zone, иZone может знать, когда это Обещание завершится.

В Angular этот контекст выполнения почти всегда означает выполнение обнаружения изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...