- PVSM.RU - https://www.pvsm.ru -

ES2018 — метод промисов finally

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

ES2018 — метод промисов finally - 1


Если вы только начинаете осваивать 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

Методу 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 до появления его стандартных реализаций?

ES2018 — метод промисов finally - 2 [13]

Автор: 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