Si hago una Promesa que nunca se cumple:
const nothingPromise = new Promise((resolve) => {});
Y luego await esa Promesa dentro de un ciclo while infinito:
async function run() { while (true) { await nothingPromise;}}
Cualquier función then() adjunta a la función no se ejecutará, pero tampoco obtengo un bucle infinito. Me sale una Promesa pendiente. En la consola de Chrome:
run().then(() => console.log('then')) Promise {<pending>}
¿Por qué se devuelve una Promesa pendiente? Tengo la sensación de que tiene algo que ver con esta parte de la especificación ECMAScript:
La operación abstracta LoopContinues toma la finalización de argumentos y labelSet y devuelve un valor booleano. Realiza los siguientes pasos cuando se le llama:
- Si finalización.[[Tipo]] es normal, devuelve verdadero.
- Si la finalización. [[Tipo]] no continúa, devuelve falso.
- Si finalización.[[Objetivo]] está vacío, devuelve verdadero.
- Si finalización.[[Target]] es un elemento de labelSet, devuelve verdadero.
- Falso retorno.
Pero no sé qué condición de finalización corresponde a await nothingPromise .
await envía la función en la que se encuentra a dormir hasta que:
Así que comienza el ciclo while , se await la promesa y la función que llama a run() recibe la promesa devuelta por run (que está pendiente porque run está inactiva) y continúa.
Dado que nothingPromise nunca se resuelve, la función de run nunca se activa, por lo que nunca se completa y nunca resuelve la promesa que devuelve.
La parte de la especificación que encontró es irrelevante ya que await envía run a dormir en medio de la primera iteración del ciclo, por lo que el ciclo nunca llega a completarse.