JavaScript метод Promise.finally()

JavaScript Promise

Определение и применение

JavaScript метод .finally()ECMAScript 2015 объекта Promise добавляет обработчик, который будет вызван вне зависимости от того с каким результатом объект Promise был выполнен (rejected - выполнение отклонено, или fulfilled - успешное выполнение).

Метод .finally()ECMAScript 2015 позволяет избежать дублирования кода в обработчиках, вызываемых когда объект Promise имеет состояние fulfilled (успешное выполнение), или rejected (выполнение отклонено), что обеспечивает возможность выполнить определенный код, когда обещание было обработано, независимо от его состояния.

Обращаю Ваше внимание, что метод .finally()ECMAScript 2015 не получает аргументов, это связано с тем, что не существует способа определить, будет обещание выполнено успешно, или с ошибкой. Этот метод рекомендуется использовать в том случае, когда не важна причина ошибки, или результат успешного выполнения и, следовательно, нет необходимости ее/его передавать.

В чем заключается отличие метода .finally()ECMAScript 2015 от then()ECMAScript 2015 Вы можете увидеть в примере внизу страницы.

Поддержка браузерами

МетодChrome
Chrome
Firefox
Firefox
Opera
Opera
Safari
Safari
Internet Explorer
IExplorer
Microsoft Edge
Edge
.finally()ECMAScript 201563.058.050.011.1НетНет

JavaScript синтаксис:

p.finally(onFinally);

onFinally - Function

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

ECMAScript 2015 (6th Edition, ECMA-262)

Значения параметров

ПараметрОписание
onFinallyФункция, которая будет вызвана, когда обещание имеет состояние settled (решенный) - обещание выполнено, или отклонено.

Пример использования

Базовое использование метода finally()

const promise = Promise.resolve("Успешно"); // обещание успешно выполнено с заданным значением
const promise2 = Promise.reject(new Error("Отклонено")); // обещание отклонено с заданным значением

promise.finally(() => console.log("Обещание успешно выполнено, или отклонено")) // добавляем обработчик, который будет вызван, когда обещание имеет состояние settled (решенный)
              .then(val => console.log(val), err => console.log(err.message)) // добавляем обработчики для успешного выполнения и для случая, когда выполнение отклонено
              .finally(() => console.log("Обещание успешно выполнено, или отклонено")); // добавляем обработчик, который будет вызван, когда обещание имеет состояние settled (решенный)

// Обещание успешно выполнено, или отклонено
// Успешно
// Обещание успешно выполнено, или отклонено

promise2.finally(() => console.log("Обещание успешно выполнено, или отклонено")) // добавляем обработчик, который будет вызван, когда обещание имеет состояние settled (решенный)
                .then(val => console.log(val), err => console.log(err.message)) // добавляем обработчики для успешного выполнения и для случая, когда выполнение отклонено
                .finally(() => console.log("Обещание успешно выполнено, или отклонено")); // добавляем обработчик, который будет вызван, когда обещание имеет состояние settled (решенный)

// Обещание успешно выполнено, или отклонено
// Отклонено
// Обещание успешно выполнено, или отклонено

В этом примере мы инициализировали две переменные, которые содержат объект Promise, который был успешно выполнен с заданным значением в первом случае, и отклонен во втором с указанием причины в качестве значения.

С помощью метода .finally()ECMAScript 2015 мы установили по два обработчика, которые должны сработать, когда обещание успешно выполнено, или отклонено. Кроме того, с помощью метода then()ECMAScript 2015 мы установили обработчики для успешного выполнения и для случая, когда выполнение отклонено.

Для первого объекта Promise будет вызван обработчик для уcпешного выполнения, и выведет в консоль полученное значение, а для второго объекта Promise сработает обработчик метода then()ECMAScript 2015, предназначенный для того случая, когда выполнение было отклонено, в результате чего мы выводим в консоль текст ошибки.

Обратите внимание на то, что методы .finally()ECMAScript 2015 срабатывают в обоих случаях, независимо от того, какое состояние имеет объект Promise (fulfilled - успешное выполнение, или rejected - выполнение отклонено).

Отличие метода then() от finally()

Promise.resolve(1).then(() => {}, () => {}) // возвращает значение undefined
Promise.resolve(1).finally(() => {}) // возвращает значение 1

Promise.reject(1).then(() => {}, () => {}) // возвращает значение undefined
Promise.reject(1).finally(() => {}) // возвращает значение 1

Обратите внимание на основное отличие методов .finally()ECMAScript 2015 от then()ECMAScript 2015, метод .finally()ECMAScript 2015 передает полученное значение дальше без необходимости его явно возвращать, в отличии от метода then()ECMAScript 2015, который будет возвращать значение undefined.

Отклонение обещания внутри finally()

const promise = Promise.resolve("Успешно"); // обещание успешно выполнено с заданным значением
const promise2 = Promise.resolve("Успешно"); // обещание успешно выполнено с заданным значением

promise.finally(() => {throw new Error("Отклонено")})
              .catch(err => console.log(err.message));

// Отклонено

promise2.finally(() => new Promise(function(resolve, reject){
  reject(new Error("Отклонено"));
})).catch(err => console.log(err.message));

// Отклонено

В этом примере мы инициализировали две переменные, которые содержат объект Promise, который был успешно выполнен с заданным значением.

С помощью метода .finally()ECMAScript 2015 мы установили обработчики, которые должны сработать, когда обещание успешно выполнено, или отклонено. Внутри метода .finally()ECMAScript 2015 мы в первом случае генерируем исключение с указанным значением ошибки, а во втором случае возвращаем новое отклоненное обещание.

Генерация исключения, или возврат отклоненного обещания внутри вызова метода .finally()ECMAScript 2015 позволяет отклонить новое обещание с указанной причиной отклонения.

С помощью метода catch()ECMAScript 2015 мы добавляем обработчики, которые будут вызваны при изменении состояния объекта Promise на rejected (выполнение отклонено), и выводим в консоль текст ошибки.

JavaScript Promise
×

Кажется, вы используете блокировщик рекламы :(

Этот ресурс не является коммерческим проектом и развивается на энтузиазме автора сайта, который посвящает все свое свободное время этому проекту.

Добавьте, пожалуйста, basicweb.ru в исключения блокировщика рекламы, этим вы поможете развитию проекта.