为什么只有一次下一个函数在生成器递归中运行?

时间:2018-01-19 07:57:41

标签: javascript arrays recursion generator

在我的思考中。我必须通过以下代码多次运行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-JSchapter 3的名字。

1 个答案:

答案 0 :(得分: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());