Promessa JavaScript finalmente()

Resumo : neste tutorial, você aprenderá como usar o finally()método JavaScript Promise para executar o código assim que a promessa for cumprida, independentemente de seu resultado.

Introdução ao método JavaScript Promise finalmente()

Suponha que você tenha uma promessa :

promise
    .then(result => { ...})
    .catch(error => { ... })
    .finally(() => { ... })Linguagem de código:  JavaScript  ( javascript )

O finally()método é sempre executado independentemente de a promessa ser cumprida ou rejeitada. Em outras palavras, o finally()método é executado quando a promessa é cumprida.

O finally()método foi introduzido no ES2018. No finally()método, você pode colocar o código que limpa o recurso quando a promessa é cumprida, independente do seu resultado.

Ao usar o finally()método, você pode evitar código duplicado nos métodos then()e catch()como este:

promise
    .then(result => {
        // process the result
        // clean up the resources
    })
    .catch(error => {
        // handle the error
        // clean up the resources
    });
Linguagem de código:  JavaScript  ( javascript )

Agora, você pode mover a parte de limpeza dos recursos para o finally()método a seguir:

promise
    .then(result => {
        // process the result
    })
    .catch(error => {
        // handle the error
    })
    .finally(() => {
        // clean up the resources
    });
Linguagem de código:  JavaScript  ( javascript )

O finally()método é semelhante ao finallybloco da try...catch...finallyinstrução. No código síncrono, você usa o finallybloco para limpar os recursos. No código assíncrono, você usa o finally()método.

O exemplo do método JavaScript Promise finalmente()

O seguinte define uma Connectionclasse:

class Connection {
    execute(query) {
        if (query != 'Insert' && query != 'Update' && query != 'Delete') {
            throw new Error(`The ${query} is not supported`);
        }
        console.log(`Execute the ${query}`);
        return this;
    }
    close() {
        console.log('Close the connection')
    }
}
Linguagem de código:  JavaScript  ( javascript )

A Connectionclasse possui dois métodos: execute()e close():

  • O execute()método executará apenas a consulta de inserção, atualização ou exclusão. Irá gerar um erro se você passar para outra consulta que não esteja na lista.
  • O close()método fecha a conexão, meio que limpando o recurso.

A connect()função a seguir retorna uma promessa que é resolvida como new Connectionse o sinalizador de sucesso for definido como verdadeiro:

const success = true;

function connect() {
    return new Promise((resolve, reject) => {
        if (success)
            resolve(new Connection());
        else
            reject('Could not open the database connection');
    });
}
Linguagem de código:  JavaScript  ( javascript )

O exemplo a seguir usa o finally()método para fechar a conexão:

let globalConnection;

connect()
    .then((connection) => {
        globalConnection = connection;
        return globalConnection.execute('Insert');
    })
    .then((connection) => {
        globalConnection = connection;
        return connection.execute('Select');
    })
    .catch(console.log)
    .finally(() => {
        if (globalConnection) {
            globalConnection.`close()`;
        }
    });
Linguagem de código:  JavaScript  ( javascript )

Neste exemplo:

  • A connect()função é resolvida para um novo Connection  objeto porque o successsinalizador está definido como true.
  • O primeiro then()método executa a Insertconsulta e retorna um Connectionobjeto. O globalConnectioné usado para salvar a conexão.
  • O segundo then()método executa a Selectconsulta e gera um erro. O catch()método mostra a mensagem de erro e finally()fecha a conexão.

Resumo

  • O finally()método agenda uma função para ser executada quando a promessa for cumprida, cumprida ou rejeitada.
  • É uma boa prática colocar o código que limpa os recursos no finally()método assim que a promessa for cumprida, independentemente do seu resultado.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *