Promise.prototype.finally()

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 provee una manera para correr código sin importar si una promesa se resuelve con éxito o falla.

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 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 procesamiento 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

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 Estado Comentario
ECMAScript Latest Draft (ECMA-262)
La definición de 'Promise.prototype.finally' en esta especificación.
Draft  

Compatibilidad en navegador

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome para AndroidFirefox para AndroidOpera para AndroidSafari en iOSSamsung InternetNode.js
finally()Chrome Soporte completo 63Edge Soporte completo 18Firefox Soporte completo 58IE Sin soporte NoOpera Soporte completo 50Safari Soporte completo 11.1WebView Android Soporte completo 63Chrome Android Soporte completo 63Firefox Android Soporte completo 58Opera Android Soporte completo 46Safari iOS Soporte completo 11.3Samsung Internet Android Soporte completo 8.0nodejs Soporte completo 10.0.0

Leyenda

Soporte completo  
Soporte completo
Sin soporte  
Sin soporte

Ver también