Promise.prototype.finally()

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

Це допомагає уникати дублювання коду у обробниках проміса then() та catch().

Синтаксис

p.finally(onFinally);

p.finally(function() {
   // встановлений (виконаний або відхилений)
});

Параметри

onFinally
Функція, що викликається, коли Promise встановлений.

Значення, що повертається

Вертає проміс, чиєму обробнику finally присвоєна вказана функція onFinally.

Опис

Метод finally() може бути корисним, якщо ви хочете виконати певну обробку або прибирання, як тільки проміс встановлено, незалежно від результату.

Метод finally() дуже схожий на виклик .then(onFinally, onFinally), але є пара відмінностей:

  • Створюючи вбудовану функцію, ви можете передати її один раз, замість того, щоб або оголошувати її двічі, або створювати для неї змінну
  • Зворотній виклик finally не отримує жодних аргументів, оскільки не існує надійних методів визначити, чи був проміс виконаний, чи відхилений. Цей випадок використання розрахований саме на те, що вам неважлива причина відхилення чи повернене значення, і тому немає необхідності їх надавати. Отже, для прикладу:
    • На відміну від Promise.resolve(2).then(() => {}, () => {}) (який буде вирішений з undefined), Promise.resolve(2).finally(() => {}) буде вирішений з 2.
    • Також, на відміну від Promise.reject(3).then(() => {}, () => {}) (який буде виконаний з undefined), Promise.reject(3).finally(() => {}) буде відхилений з 3.

Заувага: throw (або повернення відхиленого проміса) у зворотному виклику finally відхилить новий проміс з причиною відхилення, вказаною у виклику 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("От халепа, немає JSON!");
  })
  .then(function(json) { /* обробити JSON далі */ })
  .catch(function(error) { console.error(error); /* цей рядок може викинути помилку, наприклад, якщо console = {} */ })
  .finally(function() { isLoading = false; });

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

Специфікація
ECMAScript (ECMA-262)
The definition of 'Promise.prototype.finally' in that specification.

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
finally()Chrome Full support 63Edge Full support 18Firefox Full support 58IE No support NoOpera Full support 50Safari Full support 11.1WebView Android Full support 63Chrome Android Full support 63Firefox Android Full support 58Opera Android Full support 46Safari iOS Full support 11.3Samsung Internet Android Full support 8.0nodejs Full support 10.0.0

Legend

Full support  
Full support
No support  
No support

Див. також