Si Microtask Queue tiene más prioridad que Macrotask Queue, ¿por qué el orden de los registros de la consola es
scriptStartscriptEndsetTimeoutResponseen vez de
scriptStartscriptEndResponsesetTimeout dado que for(let i=0;i<100000000;i++){ const start = Date.now(); } toma suficiente tiempo para mantener ocupado el subproceso principal, hasta que llega la respuesta de fetch?
Código completo
console.log("scriptStart") setTimeout(() => { console.log("setTimeout"); }, 0); fetch("https://jsonplaceholder.typicode.com/todos/1").then(() => { console.log('Response'); }); for (let i = 0; i < 100000000; i++) { const start = Date.now(); } console.log("scriptEnd")Como puede ver en la pestaña Red del depurador, la solicitud al servidor comienza solo cuando se libera el hilo (el ciclo finaliza). Entonces, mientras fetch recibe datos del servidor, setTimeout tiene tiempo para hacerlo.
Porque el intérprete es de subproceso único. Parece que estás confundiendo tareas con hilos. Ellos no son. Son solo una lista vinculada de devoluciones de llamada.
El intérprete funciona así:
START │ ▼ execute javascript │ ▼ Event loop ┌──────────┐ │ │ │ │ │ ▼ │ check if there's any ─────────▶ handle event │ event completion │ │ │ │ │ ▼ │ │ check if we need to execute ◀─────────┘ │ any javascript in ───────────────▶ execute │ the microtask list javascript │ │ │ │ ▼ │ │ check if we need to execute ◀─────────┘ │ any javascript in ───────────────▶ execute │ the macrotask list javascript │ │ │ │ │ │ └────◀─────┴─────────────────◀──────────────────┘Son todos bucles. Nada corre en paralelo. Entonces, mientras esté ejecutando javascript, no está ingresando al ciclo de eventos.
Nota: si está utilizando worker_threads o webworkers, esa es una historia diferente porque realmente generan hilos.