问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

generator是什么意思

发布网友 发布时间:2022-05-14 14:39

我来回答

3个回答

懂视网 时间:2022-05-14 19:01

本篇文章给大家带来的内容是关于ES6中Generator是什么意思?ES6中Generator的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

ES6中Generator

Generator是ES6一个很有意思的特性,也是不容易理解的特性。不同于let/const提供了块级作用域这样明显的目的,这玩意儿被搞出来到底是干嘛的?

首先我们需要明确一个问题,在JavaScript中,任何一个函数只要开始执行,便无法停止下来直到执行完成(别跟我提debug,你见过哪个用户在使用产品的还得开个debug调试你的代码)。

but,Generator提供这种能力。 看下面代码:

function *g(){
 console.log('start');
 yield 1;
 console.log('middle');
 yield 2;
 console.log('end');
}
var g1 = g();
console.log(g1.next()); 
// start
// {value: 1, done: false}
console.log(g1.next()); 
// middle
// {value: 2, done: false}
console.log(g1.next()); 
// end
// {value: undefined, done: true}

根据输出结果,我们看到,在函数g中,碰到yield关键词,运行的程序会停下来。只有调用 next()方法,才会继续执行函数g中的代码。所以函数g本身有暂停状态。

至此,我们需要知道:

  • Generator不是函数,不是函数,不是函数;

  • g()不会立即出发执行,而是一上来就暂停,并返回一个Iterator对象;

  • 每次g1.next()都会打破暂停状态去执行,直到遇到下一个yield或者return

  • 遇到yield时,会执行yeild后面的表达式,并返回执行之后的值,然后再次进入暂停状态,此时done: false。

  • 遇到return时,会返回值,执行结束,即done: true

  • 每次g.next()的返回值永远都是{value: ... , done: ...}的形式

  • Generator与异步

    既然Generator可以函数停下来,有些脑洞清奇的人,想到了可不可以用Generator处理异步程序。

    先看一个传统例子:

     function asyn(fn) {
     return new Promise((resolve,reject)=>{
      setTimeout(()=>{
      fn();
      resolve(true);
      }, 1000);
     });
     }
    
     function main() {
     console.log('start');
     asyn(function(d) {
      console.log('async one');
      asyn(function(d) {
      console.log('async two');
      console.log('end');
      });
     });
     }
    
     main();

    再来看看使用了Generator的异步程序:

     function asyn(fn) {
     return new Promise((resolve,reject)=>{
      setTimeout(()=>{
      fn();
      resolve(true);
      }, 1000);
     });
     }
    
     co(function*() {
     console.log('start');
     yield asyn(function(d) {
      console.log('async one');
     });
    
     yield asyn(function(d) {
      console.log('async two');
     });
     console.log('end');
     });
    
     function co(fn) {
    
     return new Promise((resolve,reject)=>{
      let g = fn();
    
      onFullfilled();
      function onFullfilled() {
      let ret = null;
      ret = g.next();
      next(ret);
      }
    
      function next(ret) {
      if(ret.done) return resolve(ret.value);
      ret.value.then(onFullfilled);
      }
     } );
     }

    函数在异步程序没有采用嵌套回调,是直接用同步的方式写了出来。道理大概就是,有两个异步程序,用小明和小红指代它们。小红需要等小明执行完了才可以被执行,那么我们在执行到小明时,暂停程序的运行(通过yield),等到小明有了返回结果时,再执行后面跟着的小红(next())。

    在上面的程序中,我们添加了一个co函数,这个函数的作用是让Generator自动执行下去。直白来说,就是当第一个异步函数返回后,自动调用next()方法运行后面的代码。

    Generator与Koa

    Koa是基于Node.js的Web应用框架。在Koa中,处理的异步程序主要是网络请求(HTTP)、文件读取和数据查询。这里面的异步场景较多,如果再加上程序分层,采用传统的callback方式,那回调多了去了。

    app.on('get', function(){
     auth(function(){
     router(function(){
      find(function(){
      save(function(){
       render(function(){
       //......
       })
      })
      })
     })
     })
    
    })

    这样写法对于程序维护及其不利,毫无便捷性可言。在有了generator后,我们便可以像上面那种方式来写程序。Koa最初的版本就是通过这种方式,让中间处理程序都转成一个个"yield"(中间件)。通过中间件的形式去处理客户端请求,让开发App应用更加灵活,不受框架自身限制。

    在最新的Koa2中,已经抛弃了Genetator,转而使用async/await。

    但是无论采用哪种方式,其本质都是利用了Promise。

    热心网友 时间:2022-05-14 16:09

    您好!
    意思是:发电机;发生器;生产者

    望您采纳,谢谢您的支持!

    热心网友 时间:2022-05-14 17:27

    n. 发电机;发生器;生产者
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    支付宝健康码变色规则 ...变绿码?昨天做了核酸检测结果是阴性,多久健康码从黄码变成绿码_百度... 母亲有乙肝孩子一定会有吗 ...的作文,600字,要有真实情感最好写心灵的。帮帮忙,必采纳。谢谢啦... ...自我介绍怎么写呀!,急急急!!!拜托各位谢谢啦!!_百度... 以“我身边的文明礼仪”为题写一篇作文,请各位大侠帮帮忙啦... 石家庄100平米房子改水电多少钱一平 石家庄居民水电煤气费都是多少钱? 石家庄水电一个月多少钱一个月多少钱 石家庄水电价格是多少钱 网上官方新闻在哪看,求网站 姓孟,河北人 2012年6月9日12:25生一女孩,请根据生辰八字起一名字。 推荐一下介绍北洋军阀统治时期的书 高三文科生看哪些节目有利于学习 姓孟,2010年4月3日11点30分出生,男孩 求一个大气有诗意内涵的名字 小数乘小数三十道带竖式 母亲欠债遭11人*,儿子目睹后刺死1人,被判无期。当情与法难以相容时,儿子的行为值得原谅吗? 出30道小数乘小数和小数乘整数 网易和腾讯都算是南方系吗? 中国什么报纸质量最高 请问中国比较左的报纸有那些? 中国报系有哪些?(例如南方报系),具体哪些报纸属于哪个报系? 做梦梦到一群比较像狼狗的动物,它们会说话,还吃人,跟着我回家袭击我,它手准备掏我肚子的时候吓醒了, 国家级贫困县房价破6000元平米是怎么回事? 为什么这两天,总是梦到动物咬我,还被惊醒了,预示着什么? 什么原因致国家级贫困县安徽临泉房价上涨? 阜阳临泉县是个什么样的存在? 中国人口最多的县城,为啥迟迟不建火车站? 第一次带隐形眼镜选怎么样比较好,比较舒服? 什么牌子的隐形眼镜好带上,小一些,好带一些的! 高中生看南方周末好还是环球时报好 50道小数乘小数的过程和答案谢谢大家 小数乘小数竖式计算加答案 小数乘小数的题目 有没有120道小数除法(小数除小数的)和80道小数乘法题(小数乘小数的(要有答案) 没有在公司上班了,房贷利息扣缴义务人还是公司怎么办 轿车加满一箱油多少钱 用什么方法增强WiFi信号? 11款macbook air联网恢复开机按什么来着?不是alt 求助,macbook air网络还原出现问题,连不上wifi 斩字下面一个土 斩加土念什么? 斩下一个土是什么字 斩首的展的加个土念啥呀? 斩下去土读什么 一斩土边人是什么谜语? 一个人一个三点水一个斩还有两土字打一成语 我的世界generator是什么意思 对广西旅游的认识 蛋炒饭的顺序是什么?