03. Generator Execution
Использование генератора состоит из двух частей:
Описании функции генератора
function* generatorFunction()
;Получение объекта генератора
generator
.
Вызов функции-генератора не начинает какое-либо выполнение, а возвращает новый объект генератора (generator object).
Каждый вызов функции-генератора порождает новый объект генератора, независимый от других.
Объект генератора ассоциирован с конкретным вызовом функции генератора (runtime call).
Generator Object
Объект генератора используется для того, что бы контролировать исполнение функции-генератора.
Метод
generator.next()
выполняет генератор до ближайшегоyield
и возвращает{done: false, value: yieldValue}
.Метод
generator.return()
завершает выполнение генератора.
Т.к. генератор имеет методы next()
и return()
, то он фактически является итератором.
Общий алгоритм работы генератора:
При создании генератора код находится в начале своего выполнения.
Вызов
next()
выполняет генератор до следующегоyield
.
yield
expression
yield
expressionОсновная цель оператора yield
передать значение от генератора наружу и обратно.
Вызов let result = yield value;
делает следующее:
При вызове
next()
функция генератор выполняется доyield value;
.Возвращает
value
во внешний код, приостанавливая выполнение генератора.`Если после
yield yieldValue;
стоит значение, то оно будет значением генератора в момент текущей остановки.Если стоит
yield
без значения, то на текущем шаге итератор возвращаетundefined
.
Внешний код может обработать значение, и затем вызвать
next
с аргументом:generator.next(x)
.Генератор продолжит выполнение, аргумент
x
будет возвращён как результатyield
и записан вresult
(let result = x
).
yield
binds very loosely, so that we don’t have to put its operand in parentheses:
Generator algorithm
Алгоритм использования генератора:
При создании генератора код находится в начале своего выполнения.
Первый
generator.next(x?)
выполнит генератор до первого оператораyield
и приостановит свою работу:Вычисляется значение
yield
.Переданное значение
x
игнорируется.В результате вызова
.next(x?)
, будет возвращен объект{done: false, value: yieldValue}
.
Последующий вызов
generator.next(x?)
:подставит на место текущего
yield
значениеx
, если оно было передано.выполнит генератор до следующего
yield
, вычислит его значение и вернет результат генератору.
Если следующего
yield
нет, то исполнение доходит до конца функцииreturn returnValue;
и возвращается{done: false, value: returnValue}
.
Last updated
Was this helpful?