El valor de Promise.all () después de ser rechazado, muestra : resuelto si el bloque catch está presente

Tengo dos promesas, una rechazada y otra resuelta. Promise.all se llama. Ejecutó el bloque catch de Promise.all ya que una de las promesas es rechazada.

const promise1 = Promise.resolve('Promise 1 Resolved'); const promise2 = Promise.reject('Promise 2 Rejected'); const promise3 = Promise.all([promise1, promise2]) .then(data => { console.log('Promise.all Resolved', data); }) .catch(error => { console.log('Promise.all REJECTED', error); }) setTimeout(() => { console.log(promise1, promise2, promise3) }, 200); 

introduzca la descripción de la imagen aquí

Si no tengo el retén en Promise.all (), el valor permanece como Rechazado, es decir,

 const promise3 = Promise.all([promise1, promise2]) .then(data => { console.log('Promise.all Resolved', data); }) 

¿Me estoy perdiendo algo acerca de las promesas?

Veo que es la respuesta pero creo que puedo aclarar un poco más.

Por favor, recuerde que cada a then() o catch() devuelven una Promise . (Si no tiene ningún return explícito en la callback, ambos devolverán Promise.resolve(undefined) ). Por lo tanto, después de que la promesa se haya resuelto, el valor de toda la cadena de promesa será la promesa devuelta por last then() ; Ejemplo:

 promise = Promise.resolve(1) .then(() => Promise.resolve(2)) .then(() => Promise.resolve(3)); console.log(promise); setTimeout(() => { console.log(promise)//Promise {: 3} }, 0) 

catch() funciona exactamente como then() . La única diferencia es que su pedido de promesas rejected lugar de resolved . En el siguiente ejemplo, simplemente reemplazo toda resolve por reject para demostrar eso.

 promise = Promise.reject(1) .catch(() => Promise.reject(2)) .catch(() => Promise.reject(3)); console.log(promise); setTimeout(() => { console.log(promise)//Promise {: 3} }, 0) 

Ahora vengo a tu pregunta. El valor de Promise.all() es una promesa rechazada, ya que una de las promesas en la matriz es rechazada. Si tiene un bloque catch en la cadena, el control irá a ese bloque catch que devolverá un Promise.resolve(undefined) . Si no tiene un bloque de captura en la cadena, obtendrá lo que tiene: una promesa rechazada.

Una catch en una Promesa actúa de la misma manera que un bloque try {} catch {} , ya que ha capturado el estado de error y el progtwig seguirá funcionando normalmente.

Por eso, cuando omites la catch , tu estado de promesa es "rejected" .

Si, después de haber captado el error, desea devolver el estado de promesa como rechazado, debe devolver una promesa rechazada desde el controlador de captura:

 const promise3 = Promise.all([promise1, promise2]) .catch(error => { console.log("REJECTED", error); return Promise.reject(error); }); console.log(promise3); // [[PromiseStatus]]: "rejected" 

Similar a hacer un throw dentro de un try {} catch { throw; } try {} catch { throw; } bloque