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.

Метод finally() возвращает Promise. Когда промис был выполнен, вне зависимости успешно или с ошибкой, указанная функция будет выполнена. Это даёт возможность запустить один раз определённый участок кода, который должен выполниться вне зависимости от того, с каким результатом выполнился Promise.

Это позволяет вам избавиться от дубликации кода в обработчиках then() и catch().

Синтаксис

p.finally(onFinally);

p.finally(function() {
   // завершён (успешно или с ошибкой)
});

p.finally(() => {
// завершён (успешно или с ошибкой)
});

Параметры

onFinally

Функция Function вызываемая когда промис завершен.

Возвращаемое значение

Возвращает Promise для которого в качестве обработчика finally задана функция onFinally.

Описание

finally() может быть полезен, если необходимо произвести какие-либо вычисления или очистку, как только Promise (промис) завершено, вне зависимости от результата.

finally() очень схож с вызовом .then(onFinally, onFinally), однако существует несколько различий:

  • Использование finally() позволяет избежать двойного объявления одной и той же функции или создания переменной.
  • finally не получает аргументов, так как не существует способа определить, будет ли промис выполнен успешно или с ошибкой. Данный метод необходимо использовать, если не важна причина ошибки или результат успешного выполнения и, следовательно, нет необходимости её/его передавать.
  • В отличие от Promise.resolve(2).then(() => {}, () => {}) (результатом которого будет resolved-промис, со значением undefined), результатом Promise.resolve(2).finally(() => {}) будет resolved-промис со значением 2.
  • Аналогично, в отличии от Promise.reject(3).then(() => {}, () => {}) (результатом которого будет resolved-промис, со значением undefined), результатом Promise.reject(3).finally(() => {}) будет rejected-промис со значением 3.

Примечание: A throw (or returning a rejected promise) in the finally callback will reject the new promise with the rejection reason specified when calling throw().

Примеры

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, we haven't got JSON!");
  })
  .then(function (json) {
    /* process your JSON further */
  })
  .catch(function (error) {
    console.log(error);
  })
  .finally(function () {
    isLoading = false;
  });

Спецификации

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

Совместимость с браузерами

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

Смотрите также