JavaScript метод Promise.finally()
JavaScript PromiseОпределение и применение
JavaScript метод .finally() объекта Promise добавляет обработчик, который будет вызван вне зависимости от того с каким результатом объект Promise был выполнен (rejected - выполнение отклонено, или fulfilled - успешное выполнение).
Метод .finally() позволяет избежать дублирования кода в обработчиках, вызываемых когда объект Promise имеет состояние fulfilled (успешное выполнение), или rejected (выполнение отклонено), что обеспечивает возможность выполнить определенный код, когда обещание было обработано, независимо от его состояния.
Обращаю Ваше внимание, что метод .finally() не получает аргументов, это связано с тем, что не существует способа определить, будет обещание выполнено успешно, или с ошибкой. Этот метод рекомендуется использовать в том случае, когда не важна причина ошибки, или результат успешного выполнения и, следовательно, нет необходимости ее/его передавать.
В чем заключается отличие метода .finally() от then() Вы можете увидеть в примере внизу страницы.
Поддержка браузерами
Метод | Chrome | Firefox | Opera | Safari | IExplorer | Edge |
---|---|---|---|---|---|---|
.finally() | 63.0 | 58.0 | 50.0 | 11.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() мы установили по два обработчика, которые должны сработать, когда обещание успешно выполнено, или отклонено. Кроме того, с помощью метода then() мы установили обработчики для успешного выполнения и для случая, когда выполнение отклонено.
Для первого объекта Promise будет вызван обработчик для уcпешного выполнения, и выведет в консоль полученное значение, а для второго объекта Promise сработает обработчик метода then(), предназначенный для того случая, когда выполнение было отклонено, в результате чего мы выводим в консоль текст ошибки.
Обратите внимание на то, что методы .finally() срабатывают в обоих случаях, независимо от того, какое состояние имеет объект 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() от then(), метод .finally() передает полученное значение дальше без необходимости его явно возвращать, в отличии от метода then(), который будет возвращать значение 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() мы установили обработчики, которые должны сработать, когда обещание успешно выполнено, или отклонено. Внутри метода .finally() мы в первом случае генерируем исключение с указанным значением ошибки, а во втором случае возвращаем новое отклоненное обещание.
Генерация исключения, или возврат отклоненного обещания внутри вызова метода .finally() позволяет отклонить новое обещание с указанной причиной отклонения.
С помощью метода catch() мы добавляем обработчики, которые будут вызваны при изменении состояния объекта Promise на rejected (выполнение отклонено), и выводим в консоль текст ошибки.
JavaScript Promise