¿Diferencias entre Promise.all() y Promise.allSettled() en JS?

4 minutos de lectura

Avatar de usuario de aeXuser264
aeXuser264

estaba leyendo el MDNmanual de Promesay encontré estos dos métodos que me parecen similares:

Ambos toman un iterable y devolver una matriz que contiene el cumplido Promises.

Entonces, ¿cuál es la diferencia entre ellos?

  • all se ejecuta para resuelto promesas, allSettled es cualquiera que esté terminado – resuelto y rechazado. La primera oración de cada artículo describe esta diferencia.

    – VLAZ

    17 de enero de 2020 a las 9:08


  • @Raymond ¿A qué sitio web hace referencia?

    – aeXuser264

    17 de enero de 2020 a las 9:12

  • y devolver una matriz ninguno de ellos devuelve una matriz, devuelven una Promesa que posiblemente podría resolverse en una matriz … pero en el caso de .all la promesa devuelta no siempre se resuelve en una matriz; está justo allí, en la primera línea de la documentación; de hecho, lea el primer párrafo de cada documentación a la que se vinculó y tendrá su respuesta.

    – Jaromanda X

    17 de enero de 2020 a las 10:25


  • Gracias a todos, tengo la respuesta. Y de ahora en adelante, leeré los manuales con más atención.

    – aeXuser264

    17 de enero de 2020 a las 10:28

Avatar de usuario de CertainPerformance
Cierto Rendimiento

Promise.all rechazará tan pronto como una de las Promesas en la matriz rechaza.

Promise.allSettled nunca rechazará – se resolverá una vez todos Las promesas de la matriz se han rechazado o resuelto.

Sus valores de resolución también son diferentes. Promise.all se resolverá en una matriz de cada uno de los valores en los que se resuelven las Promesas, por ejemplo [Promise.resolve(1), Promise.resolve(2)] se convertirá en [1, 2]. Promise.allSettled en su lugar te dará [{ status : 'fulfilled', value: 1 }, { status : 'fulfilled', value: 2 }].

Promise.all([Promise.resolve(1), Promise.resolve(2)])
  .then(console.log);
Promise.allSettled([Promise.resolve(1), Promise.resolve(2)])
  .then(console.log);

Si una de las Promesas rechaza, el Promise.all rechazará con un valor del rechazo, pero Promise.allSettled resolverá con objeto de { status: 'rejected', reason: <error> } en ese lugar de la matriz.

Promise.all([Promise.reject(1), Promise.resolve(2)])
  .catch((err) => {
    console.log('err', err);
  });
Promise.allSettled([Promise.reject(1), Promise.resolve(2)])
  .then(console.log);

Avatar de usuario de Ziaullhaq Savanur
Ziaullhaq Savanur

Promise.all: Se resuelve solo cuando todos las promesas que se le pasan (como una matriz) se resuelven; de lo contrario, se rechazará con el primero error de promesa rechazada.

Promise.allSettled: este lo hará siempre se resuelve con una matriz que tiene información sobre lo resuelto y promesas rechazadas. Eche un vistazo de cerca a las siguientes propiedades (estado, valor, razón ) de la matriz resultante.

Ejemplo 1:

const pms1 = Promise.resolve(1);
// setTimeout(function, milliseconds, param1, param2, ...)
const pms2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 200, 2);
});
const pms3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 3);
});
const pmsAry = [pms1, pms2, pms3];

Promise.all(pmsAry)
  .then(resAry => console.log(resAry)) // resAry order is same as pmsAry order
  .catch(error => console.log(error));

/* 
 * Note here we are not writing 'catch' because Promise.allSettled ALWAYS RESOLVES
 * with array containing information about resolved or rejected promises
 */
Promise.allSettled(pmsAry)
.then(resAry => console.log(resAry)); // resAry order is same as pmsAry order

Producción :

[1, 2, 3] 
// Promise.all output ORDER doesn't depend on promise resolution time

[{ status: "fulfilled", value: 1 },
 { status: "fulfilled", value: 2 }, 
 { status: "fulfilled", value: 3 }]
// Promise.allSettled output ORDER doesn't depend on promise resolution time

Ejemplo 2:

const pms1 = Promise.resolve(1);
const pms2 = new Promise((resolve, reject) => {
  setTimeout(reject, 200, '200ms Err');
});
const pms3 = new Promise((resolve, reject) => {
  setTimeout(reject, 100, '100ms Err');
});
const pmsAry = [pms1, pms2, pms3];

Promise.all(pmsAry)
  .then(resAry => console.log(resAry))
  .catch(error => console.log(error));

Promise.allSettled(pmsAry)
  .then(resAry => console.log(resAry));

Producción :

100ms Err
/* 
 * Note: Here there are TWO promises which are getting REJECTED but output is
 * ONLY ONE (i.e the one which is getting rejected FIRST) 
 */

[{ status: "fulfilled", value: 1 },             // Note: value
 { status: "rejected", reason: "200ms Err" },   
 { status: "rejected", reason: "100ms Err" }]   // Note: reason

Cuando desee asegurarse de que la promesa se resuelva o tenga éxito en la operación que está utilizando, debe usar Promise.all ya que se completa cuando se resuelve para cada una de las promesas.

Pero cuando solo desea completar todas las promesas, independientemente de si se resuelven o rechazan, use Promise.allSettled.

Ambos ejecutan promesas a granel, pero la diferencia sutil es la forma en que manejan las iteraciones de promesa.

  • “la diferencia sutil es la forma en que manejan las iteraciones de la promesa”, ¿eso significa que el orden de ejecución no es simultáneo en allSettled? por ejemplo, promesa1, luego promesa2, luego promesa3, etc.

    – Tengo que figurarme

    27 de enero de 2021 a las 11:58

Promise.all : Devuelve una promesa que resuelve, cuando se resuelven todas las promesas de una matriz y se rechaza si se rechaza una o más promesas.


Promise.allSettled : Devuelve una promesa que se resuelve cuando todas las promesas de la matriz se liquidan (rechazadas o resueltas).


Nota : Ambos toman un iterable y devuelven una matriz que contiene las Promesas cumplidas.

ingrese la descripción de la imagen aquí

¿Ha sido útil esta solución?