es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para imprimir una vez que se resuelven 2 promesas, se puede modificar el código de la siguiente manera:

    const sleep = ms =>
      new Promise(r => setTimeout(r, ms))
    
    async function nadador (nombre) {
      const inicio = Date.now()
      console.log(`${nombre} comenzó la carrera`)
      await sleep(Math.random() * 5000)
      console.log(`${nombre} terminó la carrera`)
      return { nombre, diferencia: Date.now() - inicio }
    }
    
    const nadadores =
      [ nadador("Alice"), nadador("Bob"), nadador("Claire"), nadador("David"), nadador("Ed") ];
    
    let count = 0;
    Promise.allSettled(nadadores.map(p => p.then(resultado => {
        count++;
        if(count === 2) {
            console.log(`*** Cualquier 2 nadadores han terminado la carrera ***`);
        }
        return resultado;
    })))
    .then(resultados => console.log(resultados))
    .catch(console.error);
    

    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étodo then(), que incrementa una variable count y verifica si ha alcanzado el valor de 2. Si es así, imprimimos un mensaje. Por último, registramos los resultados de todas las promesas utilizando console.log(resultados) y capturamos cualquier error utilizando catch(console.error).

Comments are closed.