У меня неожиданное поведение со следующим кодом:
function* innerGeneratorFn() {
yield 'foo';
return 'bar';
}
function* outerGeneratorFn() {
console.log('iter value:', yield* innerGeneratorFn());
}
for (const x of outerGeneratorFn()) {
console.log('value:', x);
}
Конструкция yield * хочет Iterable, а innerGeneratorFn()
- это Генератор объектов, который, в свою очередь, тоже Iterable. Значение yield * - это, вообще говоря, свойство value, сопровождающее done: true соответствующего итератора. Для классических итераторов это значение будет неопределенным. Но для итераторов, созданных из функции генератора, это значение будет иметь форму любого значения, возвращаемого функцией генератора (в данном случае innerGeneratorFn ()).
Вывод приведенного выше кода:
value: foo
iter value: bar
Вместо этого я бы ожидал следующий вывод:
value: foo
value: bar
iter value: bar
Действительно, эта похожая версия раннего кода:
function* innerGeneratorFn() {
yield 'foo';
return 'bar';
}
function* outerGeneratorFn() {
console.log('iter value:', yield*['foo', 'bar']);
}
for (const x of outerGeneratorFn()) {
console.log('value:', x);
}
Я получу в выводе:
value: foo
value: bar
iter value: undefined
Почему в первой версии кода вывод value : bar
отсутствует?