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

Г е нераторы в JavaScript отмечаются звездочками после ключевого слова function;
       в остальном их синтаксис идентичен обычным функциям. Если функция является
       генератором, вы можете использовать ключевое слово yield в дополнение к return.
          Давайте рассмотрим простой пример генератора, который возвращает все цвета
       радуги.
       function*  rainbow ( )    {  //  звездочка  указывает,  что  это  генератор
           yield  ' к расный ' ;
           yield  ' о ранжевы ' ;
                         й
           yield  ' ж елты й  ' ;
           yield  ' з еленый ' ;
           yield  ' г олубой ' ;
                     й
           yield  ' с ини ' ;
           yield  ' ф иолетовый ' ;

          Т е перь давайте рассмотрим, как происходит вызов этого генератора. Помните,
       что при вызове генератора возвращается итератор. Мы вызовем функцию, а затем
       пролистаем итератор.
       const  it   =  rainbow ( ) ;
                                          n
       i t . n ext ( ) ;    1 1    value:  "красный ",  do e :   false  }
       it . n ext ( ) ;   1 1    value :  "оранжевый",  do e :   false
                                            n
                                         n
       i t . n ext ( ) ;    1 1    value :  "желтый",  do e :   false  }
       i  .   next  ) ;    1 1    va u e :   "зеленый",  don e :   false
                         l
              (
        t
       i t . n ext ( ) ;   1 1    value :  "голубой",  don e :   false  }
       it . n ext ( ) ;   1 1    value :  "синий",  do e :   false  }
                                        n
       i t . n ext  ) ;   1 1    val u e :   "фиолетовый",  don e :   fa lse
              (
                                           e
       i t . n ext ( ) ;   1 1    val u e :   undefined,  don :   true  }
          Поскольку генератор rainbow возвращает итератор, мы можем также использо­
                          .
       вать его в цикле for  . .   of.
       for ( let  color  of  rainbow ( ) )
           console . l og ( c olor) ;
          Это выведет все цвета радуги!
       Вы р а  жения yield и двухсторонняя свя             з ь

          Как уже упоминалось, генераторы обеспечивают двухстороннюю связь между ге­
       нератором и его вызывающей стороной. Для этого используется выражение yield.
       Помните, что выражения возвращают значение, и  выражение yield тоже должно
       что-то возвращать. Оно возвращает аргументы (если они есть), предоставленные вы­
       зывающей стороной при каждом вызове метода next итератора генератора. Давайте
       рассмотрим генератор, который способен поддерживать диалог.
       function*  interrogate ( )    {
           const  name  =  yield  "Как  вас  зову ? " ;
                                          т

       210      Глава 1 2 .   Итераторы и генераторы
   203   204   205   206   207   208   209   210   211   212   213