美文网首页
Generator函数

Generator函数

作者: jasmine_6aa1 | 来源:发表于2020-12-28 09:28 被阅读0次
    1,定义

    概念:Generator是一个迭代器生成函数,器返回值是一个 Iterator 对象,可用异步调用

    2,语法:
    • 在 function 后面,函数之前加 *
    • 函数内部有 yield 表达式
    • 启动指令:Generator().next()
      注:
      * Generator 表示的是Generator函数,该函数是分段执行的
      * 表示函数为Generator函数
      * yield 定义函数内部状态,是不通阶段的分界线
    let  generalFunc = function *(){
        consloe.log(1)
        yield:'a';
        yield:'b';
        return 'c';
    }
    generalFunc() // 没有输出
    generalFunc().next() // 1  value:'a', done:false
    generalFunc().next() // value:'b', done:false
    

    // generalFunc 单纯的调用,是没有任何输出的
    // 启动:generalFunc().next()
    // 1 value:'a', done:false
    // value:'b', done:false => 表示函数还没有全部结束,只是到该暂停的阶段
    // value:'c', done:true => 表示函数已经全部结束了,没有

    3,与普通函数区别:

    可以暂停执行,所以要加 * 号,以示区别
    特点:交出函数的执行权(即暂停执行)

    4,执行机制:
    • js编程中,遇到大量的异步代码,可以使用 generator 函数进行异步同步化操作
    • Generator 函数做到异步同步化的思想是,通过阻塞主线程(同步代码)的执行,逼着CPU去执行时间队列中的异步代码
    • 核心问题:怎么判断异步代码执行完了没有?
      • 可以使用 promise 来确定是都执行完异步代码
      • 因为 promise 核心代码块执行完,才能进一步执行 resolve,而promise执行 resolve 是通过 .then() 来调用的

    案例1

    let  generalFunc = function *(){
        consloe.log(1)
        yield:'a';
        yield:'b';
        return 'c';
    }
    generalFunc() // 调用没有任何输出,返回是 Iterator 对象,并不是函数内部的执行
    generalFunc().next() // 1  value:'a', done:false
    generalFunc().next() // value:'b', done:false
    

    案例2

    
    
    

    注:执行的原理

    • Generator 函数的同步化操作需要使用 yield 暂停异步代码模块的执行
    • 通过将异步代码模块封装出去,借助 promise 来更加明确的掌握异步代码执行的情况
    • 在异步代码执行完,调用 promise().then() 来触发 resolve() 模块执行,在 then() 调用resolve里,在此调用 Generator 对象的next() 方法来达到放行后代码的执行
    4,for...of
    let  generalFunc = function *(){
        consloe.log(1)
        yield:'a';
        yield:'b';
        return 'c';
    }
    for (var v of generalFunc ) {
        console.log(v)  // 1 a  b 
    }
    

    注:for....of... 迭代 Generator 函数时,只能遍历 yield 打印出来,return 是不能打印出来的

    Generator 与 Iterator 关系
    Generator 是 Iterator 的生成器
    需求:让 object 具有 Iterator 接口

    
    
    

    相关文章

      网友评论

          本文标题:Generator函数

          本文链接:https://www.haomeiwen.com/subject/ljsynktx.html