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().

Examples

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; });

Specifications

Specification Status Comment
TC39 proposal Stage 4

Browser compatibility

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
finally()Chrome Полная поддержка 63Edge Полная поддержка 18Firefox Полная поддержка 58IE Нет поддержки НетOpera Полная поддержка 50Safari Полная поддержка 11.1WebView Android Полная поддержка 63Chrome Android Полная поддержка 63Firefox Android Полная поддержка 58Opera Android Полная поддержка 46Safari iOS Полная поддержка 11.3Samsung Internet Android Полная поддержка 8.0nodejs Полная поддержка 10.0.0

Легенда

Полная поддержка  
Полная поддержка
Нет поддержки  
Нет поддержки

See also