Почему только однажды следующая функция запускается в генераторах рекурсии?

1

По моему мнению. Я должен запускать next функцию во много раз, под кодом ниже.

среда кода: браузер Google Chrome. версия: 63.0.3239.132.

const a = [1,2,3,[4,5],6,[7,8]];

function *fun(array){
    for(let i = 0;i<array.length;i++){
        if(Array.isArray(array[i])){
            yield *fun(array[i]);
        }
    }
}

console.log(fun(a).next().done);//true

Обычно в генераторах действует только один yield Он должен выполнить дважды next функцию, а затем done true.

Например:

function *foo() {
    yield 1;
}

const iterator = foo();
console.log(iterator.next().done);//false
console.log(iterator.next().done);//true

Почему в рекурсии Пример, он запускается только один раз, а затем итератор?

Кстати, это сомнение из книги, имя которой - " You-Dont-Know-JS в chapter 3.

  • 0
    Почему вы положили ; после } из предложения if?
  • 0
    Может быть, это моя привычка кода? Это правильно или ошибка?
Показать ещё 3 комментария
Теги:
arrays
generator
recursion

1 ответ

2

Вам не хватает инструкции yield для элементов, которые не являются массивами:

const a = [1,2,3,[4,5],6,[7,8]];

function *fun(array){
    for(let i = 0;i<array.length;i++){
        if(Array.isArray(array[i])){
            yield *fun(array[i]);
        } else { // if the item is not an array
            yield array[i];
        }
    }
}

const f = fun(a);

console.log(f.next());
console.log(f.next());
console.log(f.next());
console.log(f.next());
console.log(f.next());
console.log(f.next());
console.log(f.next());
console.log(f.next());
console.log(f.next());

Ещё вопросы

Сообщество Overcoder
Наверх
Меню