JavaScript生成器,执行生成器的几种方案最佳实践
发布于 作者:苏南大叔 来源:程序如此灵动~
生成器通过yield来“单步执行”,并且返回多个值。那么,如果需求是获得这些yield返回值的集合呢?难道要不断的执行.next()来获得所有的返回值么?这就是本文要考虑的问题。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境:nodejs@20.18.0,chrome@131.0.6778.205。yield和return都可以返回值,格式是{value:_value,done:false}。
前文回顾
在JavaScript/NodeJs下,可以使用生成器来获得多个值。参考:
标的物:一个函数生成器。
function* f() {
yield "sunan";
yield "大叔";
console.log("newsn.net");
return "博客"; // 慎重使用 return
}方案一,使用 .next()
使用.next()必然是常规思路了。值得特别说明的是:超出边界,多次重复执行.next()的话,也没有任何的问题。并不会有异常抛出。只不过会得到没有意义的返回值:{ value: undefined, done: true }。
var say = f();
console.log(say.next()); // { value: 'sunan', done: false }
console.log(say.next()); // { value: '大叔', done: false }
console.log(say.next()); // { value: '博客', done: true }
console.log(say.next()); // { value: undefined, done: true }方案二,for( of ) [缺return]
for (var n of f()) {
console.log(n);
}输出:
sunan
大叔这个丢失了return返回值,并且也不是既定的json格式返回值。
方案三,... [缺return]
let a = [...f()];
console.log(a); // [ 'sunan', '大叔' ] , 丢失`return`的值这个丢失了return返回值,并且也不是既定的json格式返回值。
方案四,消费函数
function consumeGenerator(generator) {
const it = generator(); // 创建生成器实例
function next(value) {
const obj = it.next(value);
console.log(obj);
// const { value: newValue, done } = obj;
if (!obj.done) {
next();
}
}
next();
}
consumeGenerator(f);输出:
{ value: 'sunan', done: false }
{ value: '大叔', done: false }
{ value: '博客', done: true }结论
本文的结论是:在使用生成器返回值的时候,慎用return,尽量使用yield。否则可能会出现目标值丢失的情况。