Sé que si un .then recibe una promesa rechazada y no tiene un controlador para ella, la nueva promesa .then devuelve el estado de la promesa .then recibido (fuente).

De hecho, mi intuición me diría que así es como .catch, añadido al final de una cadena .then, recibe una promesa (cuando todos los .then no tienen controladores de rechazo). Se llama a cada .then, que devuelve duplicados de la promesa fallida original.

Además, cuando leo este artículo, tengo la impresión de que cuando el ejecutor de una promesa o una devolución de llamada de .then simplemente devuelve un objeto de error, de alguna manera 'saltará' y devolverá este objeto de error al controlador de rechazo más cercano (seguramente este podría ser un .then normal que tiene una devolución de llamada como segundo argumento o un .catch()). ¿Están ambas ideas aquí?

1
tonitone120 22 ago. 2020 a las 18:53

1 respuesta

La mejor respuesta

Cuando leo este artículo, tengo la impresión de que de alguna manera 'saltará'

No, eso es engañoso. Tu primera intuición fue correcta. Cuando se rechaza la promesa que .then(…) fue invocada, la promesa que devolvió .then(…) también será rechazada, y así sucesivamente en la cadena. En realidad, esto incluso lleva algo de tiempo (y otros manejadores de promesas pueden ejecutarse en el medio).

Por supuesto, el flujo de ejecución lógica omite los controladores then en todas las promesas rechazadas y lo siguiente de esta cadena que se ejecutará es un controlador de rechazo catch (o then), por lo que podría considerarlo como un "salto", pero en realidad es sólo una analogía y en realidad se implementa rechazando cada promesa a lo largo de la cadena.

Obtienes saltos reales de control de flujo cuando usas promesas con async / await en bloques try / catch.

1
Bergi 22 ago. 2020 a las 16:07