[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally [Back]  [Original]

Promise.prototype.finally() - JavaScript | MDN

Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.

View in English Always switch to English

Promise.prototype.finally()

Baseline Weitgehend verfgbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit Oktober 2018 browserbergreifend verfgbar.

Die finally()-Methode von Promise-Instanzen plant eine Funktion ein, die aufgerufen wird, wenn das Promise beendet ist (entweder erfllt oder abgelehnt). Sie gibt sofort ein weiteres Promise-Objekt zurck, wodurch es mglich ist, Aufrufe zu anderen Promise-Methoden zu verketten.

Wie der finally Block ist diese Methode normalerweise fr Aufrumarbeiten gedacht, unabhngig vom Ergebnis des Promises. Es ermglicht Ihnen, Code in den then() und catch() Handlern des Promises zu vermeiden.

In diesem Artikel

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 ausgefhrt wird, wenn dieses Promise beendet ist. Wenn die Funktion ein Promise zurckgibt, wartet das resultierende Promise darauf, dass dieses Promise beendet wird, bevor es fortfhrt. Wenn das zurckgegebene Promise abgelehnt wird, wird das resultierende Promise mit demselben Grund abgelehnt. Jeder andere zurckgegebene Wert oder der erfllte Wert des zurckgegebenen Promises wird ignoriert.

Rckgabewert

Gibt sofort ein neues Promise zurck. Dieses neue Promise ist immer ausstehend, wenn es zurckgegeben wird, unabhngig vom Status des aktuellen Promises. Wenn onFinally einen Fehler auslst oder ein abgelehntes Promise zurckgibt, wird das neue Promise mit diesem Wert abgelehnt. Andernfalls wird das neue Promise mit demselben Status wie das aktuelle Promise beendet.

Beschreibung

Die finally()-Methode kann ntzlich sein, wenn Sie einige Verarbeitung oder Aufrumarbeiten durchfhren mchten, sobald das Promise beendet ist, unabhngig von seinem Ergebnis.

Die finally()-Methode ist sehr hnlich wie das Aufrufen von then(onFinally, onFinally). Es gibt jedoch ein paar Unterschiede:

  • Bei der Erstellung einer Funktion inline knnen Sie sie einmal bergeben, anstatt gezwungen zu sein, sie entweder zweimal zu deklarieren oder eine Variable dafr zu erstellen.
  • Der onFinally-Callback erhlt kein Argument. Dieser Anwendungsfall ist genau dann, wenn Sie sich nicht um den Ablehnungsgrund oder den Erfllungswert kmmern, und daher besteht keine Notwendigkeit, ihn bereitzustellen.
  • Ein finally()-Aufruf ist normalerweise transparent und spiegelt den endgltigen Status des ursprnglichen Promises wider. Beispielsweise:
    • Im Gegensatz zu Promise.resolve(2).then(() => 77, () => 77), das ein Promise zurckgibt, das schlielich mit dem Wert 77 erfllt wird, gibt Promise.resolve(2).finally(() => 77) ein Promise zurck, das schlielich mit dem Wert 2 erfllt wird.
    • hnlich, im Gegensatz zu Promise.reject(3).then(() => 88, () => 88), das ein Promise zurckgibt, das schlielich mit dem Wert 88 erfllt wird, gibt Promise.reject(3).finally(() => 88) ein Promise zurck, das schlielich mit dem Grund 3 abgelehnt wird.

Hinweis: Ein throw (oder das Zurckgeben eines abgelehnten Versprechens) im finally-Callback lehnt das zurckgegebene Promise weiterhin ab. Zum Beispiel lehnen sowohl Promise.reject(3).finally(() => { throw 99; }) als auch Promise.reject(3).finally(() => Promise.reject(99)) das zurckgegebene Promise mit dem Grund 99 ab.

Wie catch() ruft finally() intern die then-Methode fr das Objekt auf, auf dem sie aufgerufen wurde. Wenn onFinally keine Funktion ist, wird then() mit onFinally als beide Argumente aufgerufen was fr Promise.prototype.then() bedeutet, dass kein ntzlicher Handler angehngt ist. 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, untersttzt es das Subklassing. Zudem beachten Sie den Promise.resolve()-Aufruf oben in Wirklichkeit wird der Rckgabewert von onFinally() unter Verwendung des gleichen Algorithmus wie Promise.resolve() aufgelst, aber der tatschliche Konstruktor, der verwendet wird, um das aufgelste Promise zu konstruieren, wird die Unterklasse sein. finally() erhlt diesen Konstruktor ber 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

Spezifikation
ECMAScript 2027 LanguageSpecification
# sec-promise.prototype.finally

Browser-Kompatibilitt

Siehe auch


Web Proxy Viewer  |  New URL  |  Original Page