Promise.prototype.finally()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since October 2018.
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 aPromise
é 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 comoundefined
),Promise.resolve(2).finally(() => {})
será resolvido como2
. - De maneira semelhante, diferentemente de
Promise.reject(3).then(() => {}, () => {})
(que será resolvido comoundefined
),Promise.reject(3).finally(() => {})
será rejeitado como3
.
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