Promise.prototype.finally()

O método finally() retorna uma Promise. Quando a promise for estabelecida, tenha ela sido realizada ou rejeitada, executa-se a função callback especificada. Isso permite a execução de um código que acontecerá independentemente da Promise ter sido realizada (com sucesso) ou rejeitada (com falha).

Assim, você pode evitar a duplicação do código em ambos os handlers then() e catch() da Promise.

Sintaxe

p.finally(quandoEstabelecida);

p.finally(function() {
   // concluída (realizada ou rejeitada)
});

Parâmetros

quandoEstabelecida
Uma Function chamada quando a Promise é concluída.

Valor de retorno

Retorna uma Promise onde o manipulador finally é definido como a função especificada, quandoEstabelecida.

Descrição

O método finally() pode ser útil quando você deseja realizar algum tipo de processamento ou limpeza quando a promise for estabelecida, independentemente de seu resultado (sucesso ou falha).

O método finally() é bastante similar a chamar .then(quandoEstabelecida, quandoEstabelecida). Porém, existem algumas diferenças:

  • Ao passar a função na linha (entre os parênteses do método), você precisa passá-la apenas uma vez, ao invés de ser forçado a declará-la duas vezes ou a definir em uma variável.
  • O callback de finally não poderá receber nenhum argumento, já que não existem meios confiáveis de determinar se a promise foi realizada ou rejeitada. Seu uso é para quando você realmente não se importa com os possíveis motivos de uma falha ou possíveis valores retornados de um sucesso, não tendo, portanto, razão para fornecê-los.
  • Diferentemente de Promise.resolve(2).then(() => {}, () => {}) (será resolvido como undefined), Promise.resolve(2).finally(() => {}) será resolvido como 2.
  • De maneira semelhante, diferentemente de Promise.reject(3).then(() => {}, () => {}) (que será resolvido como undefined), Promise.reject(3).finally(() => {}) será rejeitado como 3.

Nota: Um throw (ou retorno de uma promise rejeitada) no callback de finally rejeitará a nova promise com a razão de rejeição especificada na chamada de throw().

Exemplos

let carregando = true;

fetch(minhaRequisicao).then(function(resposta) {
    var tipoConteudo = response.headers.get("content-type");
    if(tipoConteudo && tipoConteudo.includes("application/json")) {
      return resposta.json();
    }
    throw new TypeError("Opa, isso não é JSON!");
  })
  .then(function(json) { /* processamento do seu JSON */ })
  .catch(function(erro) { console.log(erro); })
  .finally(function() { carregando = false; });

Especificações

Specification Status Comment
TC39 proposal Stage 4  

Compatibilidade com navegadores

BCD tables only load in the browser

Veja também