概念
-
ES6提供解决异步编程的方案之一
-
Generator函数是一个状态机,内部封装了不同状态的数据
-
用来生成遍历器对象
-
可暂停函数(惰性求值),yield可暂停,next方法可启动。每次返回的是yield后的表达式结果
特点
- function 与函数名之间有个(星号)*
- 内部用yield表达式语句来定义不同的状态
- generator 函数返回的是指针对象(接iterator),而不会执行函数内部逻辑
- 调用next方法,函数内部逻辑开始执行,遇到yield表达式停止,返回{value:yield后的表达式结果/undefined,done}
- 再次调用next方法,会从上一次停止时的yield处开始,直到最后。
- yield语句返回结果通常为undefined,当调用next方法,传参内容会作为启动时yield语句的返回值
举例
//生成遍历器对象 function 与函数名之间有个(星号)*
function* generatorExample()
{
console.log(1);
//yield 可暂停函数
let valStr=yield "hello";
console.log(valStr);
console.log(2);
//yield 可暂停函数
yield "word";
console.log(3);
//return "hello word";
}
//获取(指针对象)遍历器对象
let gener=generatorExample();
let s="";
//next方法可启动
console.log(s=gener.next()); // 1 {value:"hello";done:false}
console.log(s); // {value:"hello";done:false}
//console.log(gener.next()); //undefined 2 {value:"word";done:false}
console.log(gener.next("给valStr传的参数"));// 给valStr传的参数 2 {value:"word";done:false}
console.log(gener.next()); // 3 {value:undefined;done:true}
//如果是return // 3 {value:"hello word";done:true}
obj部署Iterator 迭代器
let obj={name:"Lily",age:23};
//obj部署Iterator 迭代器
//function* objGenerator 创建一个迭代器
obj[Symbol.iterator]=function* objGenerator(){
yield this.name;
yield this.age;
}
console.log("=====分割=====");
//obj部署Iterator 迭代器,所以可以使用 for...of
for (let i of obj) {
console.log(i); //Lily 23
}
ajax和Generator 发送请求获取数据
function getNew(url)
{
$.get(url,(data)=>{
data=JSON.parse(data);
console.log(data);
getData.next(data.url);
})
}
//生成一个遍历器
function* getDataGenerator()
{
//yield "d";
let url=yield getNew("http://127.0.0.1/new.php");
yield getNew(url);
}
//获得一个遍历器对象
let getData=getDataGenerator();
getData.next();