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
。否则可能会出现目标值丢失的情况。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。