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

generator 和alternator都是发电机,有什么区别?

发布网友 发布时间:2022-04-22 13:42

我来回答

3个回答

懂视网 时间:2022-04-22 18:03

本篇文章给大家带来的内容是关于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-04-22 15:11

    很简单。中文发电机这个词挺混淆,因为它没有说清带不带动力机,比如柴油机或其他动力。英文就好理解了generator就是engine+alternator。所以都是发电机的意思,但generator是可以发电的,alternator是不可以发电的,它是generator的一部分。

    热心网友 时间:2022-04-22 16:29

    Alternator :单指交流发电机;
    Generator = 发电机的总称(包括交流,直流) 交流发电机
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    windows8怎么本地连接 windows8如何设置网络 诸葛亮故里诸葛亮故里纪念馆 临沂诸葛亮文化旅游节历届介绍 第四届诸葛亮文化旅游节纪念诞辰 ...请根据该表回答下面问题: (1)表中A、B、C分 ...请你分析样品A、B、C中代表血浆、原尿和尿液的样品分别是... c糖蛋白化验 江诗丹顿金属手表(江诗丹顿的手表女款) 定位最好的手表? 表带上的圈叫什么 bydfo皮带是怎么上的 比亚迪f0皮带为什么经常断?什么原因? 比亚迪f0的空调皮带怎么挂 三缸比亚迪f0正时图 比亚迪F0有正时皮带吗好多公里更换 比亚迪f0三缸换链条怎么拆装 比亚迪F0的发电机皮带怎么装?求图片 比亚迪F0的发电机皮带怎么装? 投币洗衣机一次能洗几件衣服? 投币洗衣机怎么样不用投币就可以洗衣服? 投币洗衣机洗衣服怎样收费的? 你们会使用投币洗衣机洗衣服吗?? 投币洗衣机洗的衣服干净卫生吗? 投币海尔洗衣机正常洗衣服代码是什么? 投币洗衣机洗衣服过程中能打开盖子吗?打开盖子还能正常工作吗 投币洗衣机洗衣服时,能不能打开洗衣机? 苹果平板无线信号满格,但必须重启后才能打开网络是为什么? 苹果平板上不了网但已连接? _百度问一问 手游绿色征途下了个电脑版的,不用QQ和微信怎么登陆? 比亚迪f0发电机皮带松了怎么调? oppoa8怎么设置锁屏 人长高,脚也会跟着大吗 “脚长就会长高个”?孩子能长高个会有哪些表现呢? 求教,F0皮带多长时间或者多少公里更换,多谢 比亚迪f0的发电机皮带怎么走 脚长的人会不会长高的 比亚迪f0发电机皮带如何装的图片 14岁了脚长还会长么 比亚迪f0正时记号 如果脚长长了,那身高也会长么? 比亚迪f0发电机皮带怎么调? 脚长大了是不是个子也会长高?? 比亚迪f0皮带声很大怎么回事 一星期内人的脚会长吗? 比亚迪f0车皮带 时间久了 不换会费油吗? 16周岁脚还会大吗?还会长高吗? 比亚迪f o正时皮带能用多少年 OPPO a8手机如何设置图案密码。忘记之后该怎么办? 小孩脚不长了,那还能长个吗。