• Um cenário muito comum é que precisemos executar um código assim que a promise for resolvida, e para isso usamos o método .then(). Ele nos permite definir justamente a função “resolve” da promise, ou seja, a função que recebe o resultado como parâmetro e é chamada quando a promise é bem sucedida:

    function execute() {
        return new Promise((resolve, reject) => {
            console.log('A promise está sendo executada.')
            setTimeout(() => {
                console.log('Resolvendo a promise...')
                resolve('Resultado')
            }, 3 * 1000)
        })
    }
    
    const p = execute()
    
    p.then((result) => {
        console.log(`A promise foi resolvida. O resultado foi: ${result}`)
    })
    
  • O mesmo vale para quando uma promise é rejeitada. Para evitarmos o término da aplicação usamos o método .catch() para lidar com a rejeição da promise. Assim como no .then(), definimos o .catch() passando uma função como parâmetro que será justamente a função reject que será chamada em caso de rejeição, ou seja, ela própria tem como parâmetro o motivo da rejeição:

    Obs.: repare que encadeamos o .catch() no .then(), pois se não fizermos assim o código ainda resultará em erro. Ao encadearmos o .then() e o .catch() a rejeição da promise acontece da forma correta.

    function execute() {
        return new Promise((resolve, reject) => {
            console.log('A promise está sendo executada.')
            setTimeout(() => {
                if (1 + 1 === 2) {
                    reject('1 + 1 não é igual a 2')
                } else {
                    console.log('Resolvendo a promise...')
                    resolve('Resultado')
                }
            }, 3 * 1000)
        })
    }
    
    const p = execute()
    
    p.then((result) => {
        console.log(`A promise foi resolvida. O resultado foi: ${result}`)
    }).catch((err) => {
        console.log(`A promise foi rejeitada! Motivo: ${err}`)
    })
    
  • Um detalhe que vale a pena mencionar é que a forma mais comum de definirmos os métodos .then() e .catch() em uma promise é encadeá-los diretamente na chamada da função:

    // ...
    
    execute().then((result) => {
        console.log(`A promise foi resolvida. O resultado foi: ${result}`)
    }).catch((err) => {
        console.log(`A promise foi rejeitada! Motivo: ${err}`)
    })
    
  • Por fim, assim como temos o try, catch e finally para tratamento de erros, podemos definir um método .finally() que segue o mesmo princípio, sendo executado quando a promise é finalizada, independente de se foi resolvida ou rejeitada:

    Obs.: repare que nesse caso a função de callback não possui nenhum parâmetro.

    // ...
    
    execute().then((result) => {
        console.log(`A promise foi resolvida. O resultado foi: ${result}`)
    }).catch((err) => {
        console.log(`A promise foi rejeitada! Motivo: ${err}`)
    }).finally(() => {
        console.log('A promsie foi finalizada.')
    })