Promise.prototype.finally()

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

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

Синтаксис

p.finally(onFinally);

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

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

Параметры

onFinally
Функция Function вызываемая когда Promise (обещание) завершено.

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

Возвращает 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.

Note: A throw (or returning a rejected promise) in the finally callback will reject the new promise with the rejection reason specified when calling throw().

Примеры

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 Status Comment
TC39 proposal Stage 4

Браузерная совместимость

BCD tables only load in the browser

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