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
   233   234   235   236   237   238   239   240   241   242   243