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.

Die finally()-Methode von Promise-Instanzen plant eine Funktion ein, die aufgerufen wird, wenn das Promise abgeschlossen ist (entweder erfüllt oder abgelehnt). Sie gibt sofort ein anderes Promise-Objekt zurück und ermöglicht es Ihnen, Aufrufe zu verketteten Promises-Methoden fortzusetzen.

Dies erlaubt es Ihnen, die Duplizierung von Code in den then()- und catch()-Handlern des Promises zu vermeiden.

Probieren Sie es aus

function checkMail() {
  return new Promise((resolve, reject) => {
    if (Math.random() > 0.5) {
      resolve("Mail has arrived");
    } else {
      reject(new Error("Failed to arrive"));
    }
  });
}

checkMail()
  .then((mail) => {
    console.log(mail);
  })
  .catch((err) => {
    console.error(err);
  })
  .finally(() => {
    console.log("Experiment completed");
  });

Syntax

js
promiseInstance.finally(onFinally)

Parameter

onFinally

Eine Funktion, die asynchron ausgeführt wird, wenn dieses Promise abgeschlossen wird. Ihr Rückgabewert wird ignoriert, es sei denn, der Rückgabewert ist ein abgelehntes Promise. Die Funktion wird ohne Argumente aufgerufen.

Rückgabewert

Gibt sofort ein neues Promise zurück. Dieses neue Promise ist beim Zurückgeben immer ausstehend, unabhängig vom Status des aktuellen Promises. Wenn onFinally einen Fehler auslöst oder ein abgelehntes Promise zurückgibt, wird das neue Promise mit diesem Wert abgelehnt. Andernfalls wird das neue Promise denselben Status wie das aktuelle Promise erhalten.

Beschreibung

Die Methode finally() kann nützlich sein, wenn Sie nach dem Abschluss eines Promises, unabhängig von dessen Ergebnis, eine Verarbeitung oder Bereinigung durchführen möchten.

Die Methode finally() ist der Verwendung von then(onFinally, onFinally) sehr ähnlich. Es gibt jedoch einige Unterschiede:

  • Wenn Sie eine Funktion inline erstellen, können Sie diese einmal übergeben, anstatt sie zweimal deklarieren oder eine Variable dafür erstellen zu müssen.
  • Der onFinally-Callback erhält keine Argumente. Dieser Anwendungsfall eignet sich genau dann, wenn Sie sich nicht für den Ablehnungsgrund oder den Erfüllungswert interessieren und es daher nicht notwendig ist, diesen bereitzustellen.
  • Ein finally()-Aufruf ist in der Regel transparent und spiegelt den endgültigen Status des ursprünglichen Promises wider. Zum Beispiel:
    • Im Gegensatz zu Promise.resolve(2).then(() => 77, () => {}), das ein Promise zurückgibt, das schließlich mit dem Wert 77 erfüllt wird, gibt Promise.resolve(2).finally(() => 77) ein Promise zurück, das schließlich mit dem Wert 2 erfüllt wird.
    • Ebenso gibt Promise.reject(3).then(() => {}, () => 88), das ein Promise zurückgibt, das schließlich mit dem Wert 88 erfüllt wird, ein Promise zurück, das schließlich mit dem Grund 3 abgelehnt wird, wenn es als Promise.reject(3).finally(() => 88) ausgeführt wird.

Hinweis: Ein throw (oder das Zurückgeben eines abgelehnten Promises) im finally-Callback lehnt dennoch das zurückgegebene Promise ab. Zum Beispiel lehnen sowohl Promise.reject(3).finally(() => { throw 99; }) als auch Promise.reject(3).finally(() => Promise.reject(99)) das zurückgegebene Promise mit dem Wert 99 ab.

Ähnlich wie catch() ruft finally() intern die Methode then auf dem Objekt auf, auf dem sie aufgerufen wurde. Wenn onFinally keine Funktion ist, wird then() mit onFinally als beiden Argumenten aufgerufen — was für Promise.prototype.then() bedeutet, dass kein nützlicher Handler angefügt wird. Andernfalls wird then() mit zwei intern erstellten Funktionen aufgerufen, die sich wie folgt verhalten:

Warnung: Dies dient nur Demonstrationszwecken und ist kein Polyfill.

js
promise.then(
  (value) => Promise.resolve(onFinally()).then(() => value),
  (reason) =>
    Promise.resolve(onFinally()).then(() => {
      throw reason;
    }),
);

Da finally() then() aufruft, unterstützt es Subklassenbildung. Beachten Sie zudem den Promise.resolve()-Aufruf oben — tatsächlich wird der Rückgabewert von onFinally() mithilfe desselben Algorithmus aufgelöst wie Promise.resolve(). Allerdings wird der tatsächliche Konstruktor, der verwendet wird, um das aufgelöste Promise zu erstellen, die Subklasse sein. finally() erhält diesen Konstruktor durch promise.constructor[Symbol.species].

Beispiele

Verwendung von finally()

js
let isLoading = true;

fetch(myRequest)
  .then((response) => {
    const contentType = response.headers.get("content-type");
    if (contentType && contentType.includes("application/json")) {
      return response.json();
    }
    throw new TypeError("Oops, we haven't got JSON!");
  })
  .then((json) => {
    /* process your JSON further */
  })
  .catch((error) => {
    console.error(error); // this line can also throw, e.g. when console = {}
  })
  .finally(() => {
    isLoading = false;
  });

Spezifikationen

Specification
ECMAScript® 2025 Language Specification
# sec-promise.prototype.finally

Browser-Kompatibilität

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
finally()

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

Siehe auch