Понимание генератора
Один из способов восприятия yield
- это точка останова, которая возвращает значение вызывающему телу. Он также может передавать значение в теле генератора, но значение должно быть передано с использованием next()
, как описано в MDN: Генератор # следующий :
в variable = yield expression
значение, переданное в функцию .next()
, будет присвоено переменной.
В вашем случае значение не передается в next()
(по крайней мере, не в данном коде), поэтому theObject
равен undefined
, и возникла ошибка при использовании в назначении реструктуризации.
Я попытался переделать ваш код в двух примерах, с / без аргумента, переданного ему для инициализации, а затем с некоторым циклом, чтобы продемонстрировать использование предыдущего значения.
Аргументы не переданы в генератор
Следующие аргументы не передаются в функцию генератора. Несколько выходов предназначены для демонстрации возвращаемого значения из генератора.
function* GetPositions(args={}) {
const defaults = {x:20,y:20}
const position = Object.assign({}, defaults, args)
yield position // return initial setup
const { x:posX, y:posY, scale = 1 } = position
yield {posX, posY, scale} // return next value
}
let coord = GetPositions()
console.log( coord.next().value ) // {x:20, y:20}
console.log( coord.next().value ) // {posX:20, posY:20, scale:1}
Передача аргументов в генератор
Следующее передает один объект в функцию генератора. Это только частичный объект, поскольку он содержит один ключ для демонстрации использования внутренних значений по умолчанию.
function* GetPositions(args={}) {
const defaults = {x:20,y:20}
const position = Object.assign({}, defaults, args)
yield position // return initial setup
const { x:posX, y:posY, scale = 1 } = position
yield {posX, posY, scale} // return next value
}
let coord = GetPositions({x:1}) // initial argument
console.log( coord.next().value ) // {x:1, y:20}
console.log( coord.next().value ) // {posX:1, posY:20, scale:1}
Цикл в генераторе
Это было бы ближе к тому, для чего вы могли бы использовать генератор, так как чаще используется генератор в повторяющийся способ генерации последовательностей или предварительных значений.
function* GetPositions(args={}) {
const defaults = {x:20,y:20}
const position = Object.assign({}, defaults, args)
let { x:posX, y:posY, scale = 1 } = position
yield {posX, posY, scale}
while(true){
posX+=5, posY+=5
yield {posX, posY, scale} // return next value
}
}
let coord = GetPositions({x:1}) // initial argument
console.log( coord.next().value ) // {posX:1, posY:20, scale:1}
console.log( coord.next().value ) // {posX:6, posY:25, scale:1}
console.log( coord.next().value ) // {posX:11, posY:30, scale:1}