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

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

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

BCD tables only load in the browser

Див. також