Page 238 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 238
} ) ;
Давайте поэкспериментируем с этим примером. Обратите внимание на его инте
ресное поведение. Вполне очевидно, что вы можете считать в обратном порядке от лю
1
бого числа, меньшего чем 3 , и поведение будет обычным. Обратный отсчет от 13 или
больше должен завершиться неудачей, когда дойдет до 1 3 . Однако ... вывод на консоль
будет продолжаться! Вызов rej ect (или resol ve) не останавливает нашу функцию; он
только управляет состоянием обязательства.
Конечно, наша функция countdown нуждается в некоторых усовершенствованиях.
Обычно нам не нужно, чтобы функция продолжала работать после завершения обя
зательства (успешного или нет), а наша продолжает. Мы также уже упомянули, что
вывод на консоль не очень гибок. Он действительно не дает нам желаемого контроля.
Обязательства дают нам чрезвычайно четкий и безопасный механизм для асинхрон
ных задач, которые либо выполняются, либо отклоняются, но они (пока что!) не предо
ставляют никакого способа сообщения о ходе выполнения самого процесса. Таким обра
зом, обязательство либо выполняется, либо нет. Мы никогда не узнаем, что оно выполне
но "только на 50%': В некоторых библиотеках обязательств2 реализована очень полезная
возможность сообщать о ходе выполнения процесса, и вполне возможно, что в будущем
эти функциональные возможности появятся в JavaScript, но пока что мы должны уметь
обходиться без этого, что плавно подводит нас к следующему разделу.
Соб ы тия
События (event) - это еще одна старая идея, которая получила продолжение
в JavaScript. Концепция событий проста: эмиттер (источник) события передает сооб
щение о событии, а любой, кто желает услышать (или "подписаться") об этом событии,
может сделать это. Как подписаться на событие? Используя функцию обратного вызо
ва, конечно! Создать собственную систему событий очень просто, но Node обеспечи
вает их встроенную поддержку. Если вы работаете в браузере, jQuery также предостав
ляет механизм событий. Чтобы улучшить функцию countdown, мы будем использовать
класс EventEmitter от Node. Хотя вполне можно использовать EventEmitter с такой
функцией, как countdown, он предназначен для использоваться с классом. Таким об
разом, мы превратим свою функцию countdown в класс Countdown.
const EventEmitter = require ( ' events ' ) . E ventEmitter;
class Countdown extends EventEmitter {
constructor ( seconds , superstitious )
2 Например, Q.
Обязательства 241

