Promise.prototype.finally()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since October 2018.
Метод finally()
возвращает Promise
. Когда промис был выполнен, вне зависимости успешно или с ошибкой, указанная функция будет выполнена. Это даёт возможность запустить один раз определённый участок кода, который должен выполниться вне зависимости от того, с каким результатом выполнился Promise
.
Это позволяет вам избавиться от дубликации кода в обработчиках then()
и catch()
.
Синтаксис
p.finally(onFinally); p.finally(function() { // завершён (успешно или с ошибкой) }); p.finally(() => { // завершён (успешно или с ошибкой) });
Параметры
Возвращаемое значение
Возвращает 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
.
Примечание:
A throw
(or returning a rejected promise) in the finally
callback will reject the new promise with the rejection reason specified when calling 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("Oops, we haven't got JSON!");
})
.then(function (json) {
/* process your JSON further */
})
.catch(function (error) {
console.log(error);
})
.finally(function () {
isLoading = false;
});
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-promise.prototype.finally |
Совместимость с браузерами
BCD tables only load in the browser