Кратко
СкопированоМетод finally используют для выполнения кода при завершении промиса. Код выполнится как при переходе промиса в состояние fulfilled, так и в rejected.
Метод принимает один аргумент:
on— функция-колбэк, которая будет вызвана при завершении промиса.Done
Возвращает новый промис.
Как пишется
Скопировано
// getPasswords() — асинхронная функция, которая возвращает промисgetPasswords().finally(function () { // выполнится, когда операция завершилась успехом или ошибкой})
// getPasswords() — асинхронная функция, которая возвращает промис
getPasswords().finally(function () {
// выполнится, когда операция завершилась успехом или ошибкой
})
Как понять
Скопированоfinally выполняет переданный ему колбэк независимо от того, как завершилась асинхронная операция.
Метод используют для того, чтобы избежать повторения кода между then и catch. Обычно такой код занимается уборкой после операции — скрывает индикаторы загрузки, закрывает меню и т.д.
Колбэк у finally не содержит параметров. Это следствие того, что колбэк будет вызван как при успехе, так и при ошибке.
На практике
Скопированосоветует
Скопировано🛠 finally отлично работает в случаях, когда нужно убрать лоадер со страницы или кнопки. Он сработает вне зависимости от результата промиса, поэтому можно избежать дублирования кода.
Вместо:
// используем, флаг чтобы показать что форма отправляетсяlet isLoading = truesendForm().then((res) => { isLoading = false alert('ok')}).catch((err) => { isLoading = false alert(`Ошибка: ${err.message}`)})
// используем, флаг чтобы показать что форма отправляется
let isLoading = true
sendForm().then((res) => {
isLoading = false
alert('ok')
}).catch((err) => {
isLoading = false
alert(`Ошибка: ${err.message}`)
})
Можно написать:
let isLoading = truesendForm().then((res) => { alert('ok')}).catch((err) => { alert(`Ошибка: ${err.message}`)}).finally(() => { isLoading = false})
let isLoading = true
sendForm().then((res) => {
alert('ok')
}).catch((err) => {
alert(`Ошибка: ${err.message}`)
}).finally(() => {
isLoading = false
})