Мы используем 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, но в этом суть.