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.
El método finally()
devuelve una Promise
. Cuando la promesa se resuelve, sea exitosa o rechazada, la función de callback específicada será ejecutada. Esto ofrece una forma de ejecutar código sin importar como se haya resuelto la promesa.
Esto ayuda a evitar tener código duplicado tanto en el then()
como en el catch()
.
Sintaxis
p.finally(alFinalizar);
p.finally(function () {
// finalizada (exitosa o rechazada)
});
Parámetros
alFinalizar
-
Una
Function
llamada cuando laPromise
se resuelve con éxito o falla.
Valor de retorno
Devuelve una Promise
cuyo finally
fue fijado a la función específicada en alFinalizar
.
Descripción
El método finally()
puede ser de utilidad si quieres hacer algún proceso o limpieza una vez que la promesa termina, sin importar su resultado.
Utilizar finally()
es muy similar a llamar .then(onFinally, onFinally)
, sin embargo tiene algunas diferencias:
- Cuando usamos una función
inline
, se la puede pasar una sola vez, en vez de estar forzado a declararla dos veces, o guardarla en una variable. - Un callback
finally
no recibe ningún argumento, ya que no hay una manera fehaciente de determinar si la promesa fue exitosa o fallida. Este caso de uso es precisamente para cuando no nos importa la razón por la que falló o el valor al que resuelve, y no hay necesidad de proveerlos. - A diferencia de
Promise.resolve(2).then(() => {}, () => {})
(que va a resolver aundefined
),Promise.resolve(2).finally(() => {})
resolverá con un2
. - Del mismo modo, a diferencia de
Promise.reject(3).then(() => {}, () => {})
(que resolverá conundefined
),Promise.reject(3).finally(() => {})
será rechazada con un3
.
Nota:
Un throw
(o retornar una promesa rechazada) en el callback finally
va a rechazar la nueva promesa con la razón de rechazo especificada al llamar throw()
.
Ejemplos
let isLoading = true;
fetch(myRequest)
.then(function (response) {
var contentType = response.headers.get("content-type");
if (contentType && contentType.includes("application/json")) {
return response.json();
}
throw new TypeError("Oops, no hemos obtenido un JSON!");
})
.then(function (json) {
/* procesar el JSON */
})
.catch(function (error) {
console.log(
error,
); /* esta línea podría arrojar error, e.g. cuando console = {} */
})
.finally(function () {
isLoading = false;
});
Especificaciones
Specification |
---|
ECMAScript Language Specification # sec-promise.prototype.finally |
Compatibilidad con navegadores
BCD tables only load in the browser