【问题标题】:Why only once next function running in generators recursion?为什么在生成器递归中只运行一次下一个函数?
【发布时间】:2018-06-28 10:08:22
【问题描述】:

在我看来。我必须通过下面的代码多次运行next 函数。

代码环境:谷歌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

为什么在递归示例中,它只运行一次,然后迭代器就完成了?

顺便说一下,这个疑问来自chapter 3You-Dont-Know-JS这本书。

【问题讨论】:

  • 你为什么在 if 子句的 } 后面加上 ;
  • 我是我的代码习惯?是对还是错?
  • 这是一个错误。
  • 在您的代码中,当值不是数组时,没有什么可以产生的。当您遍历第一个数组并找到一个数组作为项目时,您委托给一个新的生成器(相同但在数组值上)。 yield *fun 表示您委托给一个新的迭代器。你还在等什么行为?

标签: javascript arrays recursion generator


【解决方案1】:

您缺少用于非数组项的 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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2015-01-01
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多