美文网首页
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