- PVSM.RU - https://www.pvsm.ru -
Автор заметки, перевод которой мы сегодня публикуем, говорит, что с трудом удержался от того, чтобы не назвать её «Finally — возможность, которую все ждали», или как-то пошутить на эту тему. В итоге он решил обойтись без шуток и просто рассказать о по-настоящему важной и полезной возможности объектов Promise.

Если вы только начинаете осваивать JavaScript и не слишком хорошо знакомы с промисами (иногда их называют «обещаниями», «обещанными результатами», «Promise-объектами»), то, возможно, вам будут интересны наши предыдущие публикации на эту тему:
→ Промисы в ES6: паттерны и анти-паттерны [1]
→ JavaScript: методы асинхронного программирования [2]
→ JavaScript ES8 и переход на async / await [3]
→ Async/await: 6 причин забыть о промисах [4]
→ Побег из ада async/await [5]
→ JavaScript ES6: пишем меньше — делаем больше [6]
→ Руководство по промисам для тех, кто хочет в них разобраться [7]
→ Конструкция async/await в JavaScript: сильные стороны, подводные камни и особенности использования [8]
→ Использование промисов в JavaScript [9]
Методу Promise.prototype.finally посвящён пункт 25.6.5.3 [10] стандарта ECMAScript 2018. По информации ресурса caniuse.com [11], уровень поддержки этого метода составляет примерно 81%. Этим методом можно пользоваться и в среде Node.js.
Метод промисов finally — это одно из важнейших новшеств стандарта, которое позволяет задавать функцию, которая будет выполнена независимо от результата промиса. Такая функция выполнится и при успешном разрешении промиса и при его отклонении.
Рассмотрим пример:
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => { resolve('success!!!'); }, 2000);
});
Это — совершенно обычный промис, который разрешается через 2000 миллисекунд. Если после этого нужно выполнить какое-то действие — нам понадобится блок then:
myPromise.then(
result => { console.log(result) },
failMessage => { console.log(failMessage) }
);
Методу then переданы две анонимных функции. Первая будет выполнена в том случае, если промис будет успешно разрешён. Вторая — при его отклонении. Наш промис всегда завершает работу успешно, в консоль всегда будет выводиться сообщение success!!!. Всё это очень хорошо, но как быть, если надо, чтобы некие действия выполнялись бы и после отклонения промиса, и после успешного завершения его работы? Тут нам и поможет метод finally:
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => { resolve('success!!!'); }, 2000);
});
myPromise.then(
result => { console.log(result) },
failMessage => { console.log(failMessage) }
).finally(finallyMessage => { console.log('FINALLY!!')});
Независимо от того, как промис завершит работу, в консоль, помимо соответствующего сообщения, будет выведен текст FINALLY!!, что говорит нам о том, что функция обратного вызова, переданная методу finally, срабатывает в любом случае. Для того чтобы в этом убедиться — можете поэкспериментировать [12].
То, что в ES2018 появился метод Promise.prototype.finally, говорит о том, что в обозримом будущем можно ожидать очень высокого уровня его поддержки браузерами. Это значит, что то, для чего раньше приходилось использовать вспомогательные инструменты, созданные сторонними разработчиками, теперь может быть реализовано стандартными средствами.
В каких ситуациях может пригодиться метод Promise.prototype.finally? Например — если при запуске промиса, используемого для загрузки чего-либо, начинает воспроизводиться некая анимация, в finally можно завершить эту анимацию. В блоке finally можно, например, закрыть некое модальное окно. На самом деле, существует множество ситуаций, в которых метод finally может оказаться полезным.
Уважаемые читатели! Пользовались ли вы заменителями метода промисов finally до появления его стандартных реализаций?
Автор: ru_vds
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/296868
Ссылки в тексте:
[1] Промисы в ES6: паттерны и анти-паттерны: https://habr.com/company/ruvds/blog/339414/
[2] JavaScript: методы асинхронного программирования: https://habr.com/company/ruvds/blog/337662/
[3] JavaScript ES8 и переход на async / await: https://habr.com/company/ruvds/blog/339770/
[4] Async/await: 6 причин забыть о промисах: https://habr.com/company/ruvds/blog/326074/
[5] Побег из ада async/await: https://habr.com/company/ruvds/blog/353658/
[6] JavaScript ES6: пишем меньше — делаем больше: https://habr.com/company/ruvds/blog/354280/
[7] Руководство по промисам для тех, кто хочет в них разобраться: https://habr.com/company/ruvds/blog/358808/
[8] Конструкция async/await в JavaScript: сильные стороны, подводные камни и особенности использования: https://habr.com/company/ruvds/blog/414373/
[9] Использование промисов в JavaScript: https://habr.com/company/ruvds/blog/418085/
[10] 25.6.5.3: https://www.ecma-international.org/ecma-262/9.0/index.html#sec-promise.prototype.finally
[11] caniuse.com: https://caniuse.com/#feat=promise-finally
[12] поэкспериментировать: https://codepen.io/barzik/pen/QBbNLx
[13] Image: https://ruvds.com/ru-rub/#order
[14] Источник: https://habr.com/post/427405/?utm_source=habrahabr&utm_medium=rss&utm_campaign=427405
Нажмите здесь для печати.