para la siguiente cadena de promesa
new Promise(r=>r('b').then(()=>Promise.reject('x'))).catch(err=>console.log({error})) se devuelve la promesa interna, por lo que debería aparecer y ser capturada por el bloque catch externo y registrar el error en la consola.
pero en cambio, se resolvió.
Promise {<fulfilled>: 'b'}¿Cómo atrapar la promesa interna mediante un bloque de captura externo?
r (más típicamente llamado resolve ) no devuelve una promesa, por lo que llamar a .then es un error. Normalmente, si se arroja un error en una función ejecutora de promesas (la función que pasa new Promise ), la promesa que se está creando se rechaza con ese error. Pero como ya llamaste a resolve , cumpliste la promesa con "b" y, una vez cumplida, no se puede cambiar para que sea rechazada, por lo que el error que ocurre durante el ejecutor simplemente se suprime. (Este es un caso específico de la regla más general de que una vez que se resuelve una promesa [vinculada a un resultado] no se puede resolver de manera diferente. Una promesa se puede resolver sin [todavía] cumplirse, pero cumplirla es una forma de resolviéndolo Si no está 100% en esta terminología de promesa, consulte mi publicación de blog aquí que lo explica).
Si desea resolver la promesa que está creando con otra promesa, pásela a la función de resolve :
new Promise(resolve => { resolve(Promise.reject(new Error("x"))); }) .then(value => console.log("value", value)) .catch(error => console.error("error", error.message)); Ese ejemplo específico sería un ejemplo del antipatrón de construcción de promesa explícita (solo deberíamos usar la promesa de Promise.reject directamente), pero si tuviera una lógica de bifurcación en el ejecutor de promesas y algunas de las ramas no involucraran promesas, podría haga algo similar a esto (aunque estilísticamente tendría más sentido para mí arrojar un error o llamar a la función de reject pasada al ejecutor).