Después de tanto luchar hemos encontrado la contestación de este conflicto que agunos usuarios de nuestro sitio tienen. Si deseas compartir algún detalle puedes dejar tu información.
Solución:
Angular se basa en gran medida en zone.js para mantener un contexto de ejecución en tareas asincrónicas. Está envuelto en un servicio inyectable llamado NgZone
.
Estas zonas envuelven objetos JS comunes destinados a ejecutar tareas asíncronas, que incluyen promesas. Esto se mantiene en un Zone
como Tarea, MicroTarea, etc.
A ZoneAwarePromise
sigue siendo funcionalmente idéntico a una Promesa normal, pero internamente se mantiene al tanto de una Zone
el contexto de ejecución de , y el Zone
puede saber cuándo se completa esa Promesa.
En Angular, este contexto de ejecución casi siempre significa ejecutar la detección de cambios.
Usamos Angular porque solo podemos cambiar el modelo y actualizará la vista automáticamente para nosotros, según las plantillas declarativas que proporcionamos a través de los metadatos.
La forma en que Angular maneja esto es interceptando tres tipos de eventos:
- eventos de usuario (como clics),
- relojes (
setTimeout
,setInterval
) y - la red (
fetch
XHR,HttpClient
).
Internamente, esto se hace a través de zonas. cuando cargas setTimeout
en realidad cambia el valor predeterminado setTimeout
implementación con su propia implementación, pero con la misma firma. Cuando usted llama setTimeout
ni siquiera eres consciente de que estás usando zonas.
En un nivel muy alto, funciona más o menos así:
const originalSetTimeout = window.setTimeout
window.setTimeout = (fn, time) =>
originalSetTimeout(() => fn(); updateView() , time)
Prácticamente solo ejecuta su función como de costumbre y luego llama a otra cosa, que Angular usa para actualizar la vista.
ZoneAwarePromise
es solo una forma de usar Promise
entonces esa zona es consciente de eso Puede encontrar detalles de implementación en el código fuente de Zone.js, pero esa es la esencia.