我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

生成器通过yield来“单步执行”,并且返回多个值。那么,如果需求是获得这些yield返回值的集合呢?难道要不断的执行.next()来获得所有的返回值么?这就是本文要考虑的问题。

苏南大叔:JavaScript生成器,执行生成器的几种方案最佳实践 - 执行生成器最佳实践
JavaScript生成器,执行生成器的几种方案最佳实践(图1-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境:nodejs@20.18.0chrome@131.0.6778.205yieldreturn都可以返回值,格式是{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。否则可能会出现目标值丢失的情况。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   js