Hasta ahora consumiste promesas (fetch).
Ahora toca construir una tú mismo para entender el mecanismo desde dentro.
delay(ms)Aquí defines una operación asíncrona personalizada:
Cuando creas promesas entiendes mejor:
new Promiseresolve/rejectthen/catch o awaitPuedes añadir validaciones y usar reject para entradas inválidas.
Eso vuelve tu función más robusta y explícita.
new PromisesetTimeout para simular asincroníaresolve al terminarthen o awaitCrear promesas te da control total sobre tus propios flujos asíncronos.