Visitar URL original
Promise.prototype.finally() - JavaScript | MDN

Esta página ha sido traducida del inglés por la comunidad. Aprende más y únete a la comunidad de MDN Web Docs.

View in English Always switch to English

Promise.prototype.finally()

Baseline
Ampliamente disponible

Esta característica está consolidada y funciona en muchos dispositivos y versiones de navegador. Está disponible en todos los navegadores desde octubre de 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

js
p.finally(alFinalizar);

p.finally(function () {
  // finalizada (exitosa o rechazada)
});

Parámetros

alFinalizar

Una Function llamada cuando la Promise 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 a undefined), Promise.resolve(2).finally(() => {}) resolverá con un 2.
  • Del mismo modo, a diferencia de Promise.reject(3).then(() => {}, () => {}) (que resolverá con undefined), Promise.reject(3).finally(() => {}) será rechazada con un 3.

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

js
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

Especificación
ECMAScript® 2027 Language Specification
# sec-promise.prototype.finally

Compatibilidad con navegadores

Ver también