1. Funções async são uma forma mais conveniente de se trabalhar com promises no javascript moderno. Elas permitem criar funções que automaticamente retornam uma promise, sem que nós precisemos instanciá-la:

    async function asyncSum(a, b) {
        return a + b
    }
    
    asyncSum(1, 1).then(result => console.log(`1 + 1 é igual a ${result}`))
    
  2. Podemos ver através do exemplo da anterior que elas funcionam da mesma forma, mesmo quando utilizamos o Promise.all():

    async function asyncSubtract(a, b) {
        return a - b
    }
    
    const sumResult = asyncSum(50, 33)
    const subtractResult = asyncSubtract(50, 33)
    
    Promise.all([sumResult, subtractResult]).then(results => {
        console.log(results)
    })
    
  3. Ou ainda no exemplo com o Array.map():

    const numbers = [4, 9, 5, 13, 77]
    
    async function asyncSquare(x) {
        return x * x
    }
    
    Promise.all(numbers.map(number => asyncSquare(number))).then(squares => {
        console.log(squares)
    })