在我的思考中。我必须通过以下代码多次运行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 :(得分: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());