Page 210 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 210
В этом примере показано, что генераторы очень мощны; они позволяют вызыва
ющей стороне контролировать выполнение функций. Кроме того, поскольку вызы
вающая сторона может передать информацию в генератор, он может даже изменить
свое поведение на основании переданной информации.
Вы не можете создать генератор, используя стрелочную нотацию;
для этого следует использовать ключевое слово functio * .
n
Генератор ы и оператор return
Оператор yield сам по себе не завершает генератор, даже если это его последний
оператор. Вызов оператора return в любом месте генератора приводит к присвое
нию значения r ue свойству done. При этом не имеет значения, что вы возвращаете,
t
как показано ниже.
function* аЬс )
(
yield ' а ' ;
yield ' Ь ' ;
return ' с ' ;
const it = count ( ) ;
,
it n ext ) ; 1 1 { val u e : 'а ' done: fa lse }
(
.
,
i t . n ext ( ) ; 11 { val u e : 'Ь ' done : false }
i t . n ext ( ) ; 1 1 value: ' с , , done : true }
Хотя это и вполне корректное поведение генератора, имейте в виду, что при ис
пользовании генераторов не всегда обращают внимание на свойство value, когда
.
done - t r ue. Например, если мы будем использовать это в цикле for . . of, "с" не
будет выведено вообще.
11 выведет "а " и "Ь", но не "с "
for ( l et 1 of аЬ ( ) )
с
g
console . l o ( l ) ;
Я не рекомендую использовать оператор return для возвращения
важного значения из генератора. Для этого лучше использовать опе
ратор yield; а оператор return лучше использовать только для экс
тренной остановки генератора. Поэтому я рекомендую вообще не
указывать значений в операторе return генератора.
212 Глава 12. Итераторы и генераторы

