1. Vamos começar escrevendo a função que calcula o IMC de forma assíncrona devolvendo uma nova promise:

    function imc(weight, height) {
      return new Promise((resolve, reject) => {
        if (typeof weight  !== 'number' || typeof height !== 'number')
          reject('arguments must be of type number')
        else
          resolve(weight / (height * height))
      })
    }
    
  2. Agora podemos escrever a função que chama a função imc e então faz o tratamento apropriado em caso de resolução ou rejeição da promise:

    function showImc(weight, height) {
      imc(weight, height).then((result) => {
        console.log(`O resultado do IMC foi de ${result}.`)
    
        if (result < 18.5) console.log('Situação: MAGREZA')
        else if (result < 25) console.log('Situação: NORMAL')
        else if (result < 30) console.log('Situação: SOBREPESO')
        else if (result < 40) console.log('Situação: OBESIDADE')
        else console.log('Situação: OBESIDADE GRAVE')
      }).catch((err) => {
        console.log(err)
      })
    }
    
  3. Por fim, vamos incluir um console.log para visualizar claramente o funcionamento assíncrono da função imc e então executar as funções algumas vezes com valores válidos e inválidos:

    // ...
      }).catch((err) => {
        console.log(err)
      })
    
      console.log(`Calculando o IMC para peso ${weight} e altura ${height}...`)
    }
    
    showImc(71, 1.74)
    showImc(48, 1.60)
    showImc(71, "texto")
    showImc(82, 1.72)
    showImc(120, 1.80)