Generator函数
2020-12-28 本文已影响0人
jasmine_6aa1
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 接口