1. Já vimos que podemos utilizar funções async dentro do Promise.all(), afinal elas retornam uma promise. Porém, como o próprio Promise.all() retorna uma promise também podemos utilizar o await com ele. No código abaixo vemos que a função .map() está retornando um array de promises pendentes:

    Obs.: a função waitFor() é apenas uma forma simples de fazer o código esperar por uma quantidade arbitrária de tempo, assim simulamos um código que demora a ser executado.

    function waitFor(seconds) {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve()
        }, seconds * 1000)
      })
    }
    
    const numbers = [4, 5, 9, 13, 77]
    
    const squares = numbers.map(async number => {
        await waitFor(2)
        return number * number
    })
    console.log(squares)
    
  2. Poderíamos usar o Promise.all() para esperar pelos resultados e exibi-los através do .then():

    // ...
    
    Promise.all(squares)).then(results => {
        console.log(results)
    })
    
  3. Mas se estivermos trabalhando com uma função async podemos usar o await no próprio Promise.all():

    // ...
    
    async function execute() {
      console.time('map')
    
      const squares = await Promise.all(numbers.map(async (number) => {
        await waitFor(2)
        return number * number
      }))
    
      console.log(squares)
    
      console.timeEnd('map')
    }
    
    execute()