Page 207 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 207

Последовательность Фибоначчи продолжается бесконечно, и  наше  приложение
       не знает, сколько элементов будет необходимо, что делает ее идеальным применени­
       ем для итераторов. Единственное различие между этим и предыдущими примерами
       в том, что этот итератор никогда не будет возвращать t r ue для свойства done:
       class  FibonacciSequence  {
            [ S ym  Ьol . i terator] ( )    {
               let  а  =  О ,   Ь  =  1 ;
               return  {
                   next  )
                       (
                       let  rval  =  {  value :  Ь ,   done :  false  } ;
                      Ь  +=  а ;
                       а  =  rval . value ;
                       return  rval ;

               } ;



          Если бы мы использовали экземпляр FibonacciSequence с циклом for  . .   of, то
                                                                           .
       получили бы бесконечный цикл  . .   ведь числа Фибоначчи никогда не закончатся, ни­
                                    .
       когда! Чтобы предотвратить это, мы добавим оператор break после 10 элементов.
       const  fib  =  new  FibonacciSequence ( ) ;
       l e t  i   =  О ;
       for ( let  n  o f   fib)  {
           console . log  n )   ;
                      (
           if ( + +i  >  9 )   break ;


       Ге н е р атор ы

          Г е нераторы  (generator)  - это функции, которые используют итератор для кон­
       троля своего выполнения. Обычная функция получает аргументы и возвращает зна­
       чение, но никакого контроля вызывающая сторона над ней не имеет. Когда вы вы­
       зываете функцию, управление остается у нее до завершения. Генераторы, напротив,
       позволяют вам контролировать исполнение функции.
          Г е нераторы приносят двоякую пользу. Во-первых, они позволяют контролировать
       выполнение функции, разделяя ее на дискретные этапы. Во-вторых, они позволяют
       взаимодействовать с функцией по мере ее выполнения.
          Г е нератор похож на обычную функцию за двумя исключениями.
          •  Функция может возвратить (yield) управление вызывающей стороне в любой
             момент.
          •  Когда вы вызываете генератор, он не запускается сразу. Вместо этого вы полу­
             чаете итератор. Функция запускается при вызове метода next итератора.



                                                                   Генераторы   209
   202   203   204   205   206   207   208   209   210   211   212