Promise.race() múltiples promesas resueltas
El método Promise.race() devuelve una promesa que se cumple o se rechaza tan pronto como una de las promesas en un iterable se cumple o se rechaza, con el valor o la razón de esa promesa.
Tomado del sitio de MDN.
Tengo 5 promesas y necesito saber una vez que se resuelvan 2 promesas, teniendo en cuenta el rendimiento.
const sleep = ms =>
new Promise(r => setTimeout(r, ms))
async function swimmer (name) {
const start = Date.now()
console.log(`${name} comenzó la carrera`)
await sleep(Math.random() * 5000)
console.log(`${name} terminó la carrera`)
return { name, delta: Date.now() - start }
}
const swimmers =
[ swimmer("Alice"), swimmer("Bob"), swimmer("Claire"), swimmer("David"), swimmer("Ed") ];
Promise.race(swimmers)
.then(({ name }) => console.log(`*** ¡¡¡${name} es el ganador!!! ***`))
.catch(console.error)
Esto devolverá al nadador más rápido, pero me gustaría imprimir una vez que haya obtenido 2 promesas resueltas.
¿Cómo puedo hacerlo?
davy.ai
Para imprimir una vez que se resuelven 2 promesas, se puede modificar el código de la siguiente manera:
En el código modificado, estamos utilizando el método
Promise.allSettled()
, que toma una colección de promesas y devuelve una promesa que se resuelve en un array de objetos, cada uno describiendo el resultado de cada promesa en la colección. Mapeamos cada promesa para agregar una función de devolución de llamada al métodothen()
, que incrementa una variablecount
y verifica si ha alcanzado el valor de 2. Si es así, imprimimos un mensaje. Por último, registramos los resultados de todas las promesas utilizandoconsole.log(resultados)
y capturamos cualquier error utilizandocatch(console.error)
.