JS es un subproceso único que solo puede ejecutar código de sincronización. Pero existen métodos que son asíncronos de forma predeterminada, como setTimeout y ejecutar acciones en la base de datos o solicitudes HTTP.
Esos métodos son mensajes agregados a la cola de devolución de llamada y, cuando la pila de llamadas está vacía, los métodos en esos mensajes también se aplican a la pila de llamadas para implementarse.
Pero, ¿cómo puedo agregar un mensaje a la cola de devolución de llamada por mi cuenta?
En el entorno del navegador, hay un par de formas:
setTimeout con un intervalo 0 (o similar), que pone en cola una tareaqueueMicrotask (relativamente nuevo, pero fácilmente polillenado si el entorno admite promesas), que (¡puede que lo hayas adivinado!) pone en cola una microtarea Node.js también los tiene, y un par más que son más específicos para su ciclo de ejecución, como setImmediate (no se espera que esté estandarizado en los navegadores).
Este artículo lo explica muy bien:
https://dev.to/bipinrajbhar/how-javascript-works-web-apis-callback-queue-and-event-loop-2p3e
Los setTimeout, setImmediate, http request, dom events ...etc son parte de la API web que se implementa en el navegador y también se extiende en Node.JS (setImmediate, por ejemplo). Están aquí para agregar async a la funcionalidad JS. Por lo tanto, agregar manualmente nuevos mensajes a la cola de devolución de llamada solo es posible a través de la API web.