Esencialmente, un objeto Promise representa la finalización o el fallo de una operación asíncrona. Curiosamente, cuando se crea una promesa
a, su valor puede no estar disponible inmediatamente.
const promise = new Promise((resolve, reject) => {
// Some asynchronous operations
if (/* operation successful */) {
resolve(result);
} else {
reject(error);
}
});
Tienen 3 estados:
- Pendiente: Es el estado inicial y no se ejecuta ni se rechaza.
- Fulfilled: El estado cuando una promesa se completa con éxito y produce un valor.
- Rechazada: El estado cuando se produce un error y la operación en la promesa no tuvo éxito.
Una vez resuelta la promesa, puedes utilizar .then()
para gestionar el resultado y .catch()
para gestionar cualquier error que se haya producido durante su ejecución.
promise
.then(result => {
console.log('Success:', result);
})
.catch(error => {
console.error('Error:', error);
});
Entender Promise.all()
Cuando se trabaja con múltiples promesas
al mismo tiempo, puedes aprovechar los métodos incorporados Promise.all([])
. Este método acepta un array de promesas y devuelve una promesa unificada. La clave es que esta promesa
combinada sólo se resolverá si todas las entradas se han resuelto con éxito. Si una de ellas falla, se rechaza toda la promesa
. He aquí un ejemplo:
const promise1 = fetch('https://api.example.com/data1');
const promise2 = fetch('https://api.example.com/data2');
const promise3 = fetch('https://api.example.com/data3');
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log('All data obtained:', values);
})
.catch(error => {
console.error('An error occurred:', error);
});
Este enfoque se utiliza normalmente cuando hay varias tareas asíncronas relacionadas y su trabajo depende unas de otras, por lo que queremos que todas las tareas asíncronas tengan éxito antes de continuar con la ejecución del código.
Revelar Promise.allSettled()
Usar Promise.allSettled([])
es Promise.all([])
similar a , pero difiere en que espera a que todas las promesas
de entrada se completen o sean rechazadas, y devuelve promise
un array de objetos describiendo cada resultado.
const promise1 = Promise.resolve('Success 1');
const promise2 = Promise.reject('Error 2');
const promise3 = Promise.resolve('Success 3');
Promise.allSettled([promise1, promise2, promise3])
.then(results => {
results.forEach(result => {
if(result.status === 'fulfilled') {
console.log('Successfully obtained value:', result.value);
} else {
console.error('Rejected for reason:', result.reason);
}
});
});
//output
// Successfully obtained value: success 1
// Rejected for reason: Error 2
// Successfully obtained value: success 3
Suele utilizarse para manejar operaciones asíncronas que no dependen unas de otras y se desea conocer el resultado de cada una.
Por qué Promise.allSettled() es mejor
En general, usar Promise
.allSettled()
en lugar de Promise.all()
tiene sus ventajas en la mayoría de las situaciones comunes:
Información exhaustiva de los resultados
Si alguna de las promesas es rechazada, Promise.all( )
el rechazo inmediato puede dificultar la determinación del estado de las otras promesas
, especialmente si las otras promesas
se resuelven con éxito. Utilizando Promise.allSettled([])
se obtiene una visión completa de los resultados.
Elegante gestión de errores
Promise.all()
el enfoque «fail fast» puede ser limitado si quieres continuar mientras una de ellas falla, mientras que Promise.allSettled()
te permite manejar la promesa
los resultados de cada una individualmente.
Operaciones por lotes
Cuando se trata de operaciones por lotes, donde las operaciones individuales son independientes, puede que no quieras que todo el lote falle debido a una operación fallida.
Toma de decisiones inteligente
Usando Promise.allSettled()
, puedes tomar decisiones más informadas después de obtener los resultados de todas las promesas. Por ejemplo, cuando se obtienen datos de distintas API y una de ellas falla, se puede decidir si continuar procesando los datos o proporcionar una notificación con un mensaje de error.
Experiencia de usuario mejorada
A menudo es mejor proporcionar al usuario los resultados parciales necesarios y notificaciones de error que fallar toda la operación con algún mensaje genérico. Promise.allSettled()
hace que este enfoque sea fácil de implementar.
En resumen, Promise.all()
puede ser valiosa en algunas situaciones, pero Promise.allSettled()
proporciona un enfoque más flexible y resistente para la mayoría de los escenarios.