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 . Итераторы и генераторы

