一、生成器
生成器是函数,是es6提供的一种异步编程解决方案,语法行为与传统函数完全不同
function * gen(){
console.log("yield语句 是函数代码的分隔符,把函数代码分隔成若干块")
yield '我';
yield '是';
yield '谁';
}
//遍历
for(let v of gen())
{
console.log(v)//一次输入我、是、谁
}
//调用next
let iterator = gen();
console.log(iterator.next())//{value:'我',done:false}
console.log(iterator.next())//{value:'是',done:false}
console.log(iterator.next())//{value:'谁',done:false}
console.log(iterator.next())//{value:undefined,done:true}
二、生成器函数
function * gen(arg){
console.log(arg)//输出aaa
let one = yield 111;
console.log(one)//输出bbb
let two = yield 222;
console.log(two)//输出ccc
let three = yield 333;
console.log(three)//输出ddd
}
//执行获取迭代器对象
//1、整体函数传参
let iterator = gen('aaa');
//必须调用next()才能生效
iterator.nex() //
//2、next()方法也可以传参,而且参数将作为上一个yield语句的返回结果
iterator.next("bbb")
iterator.next("ccc")
iterator.next("ddd")
3、生成器函数实例
//异步编程 文件操作、网络操作(ajax,request)、数据库操作
//需求1:1s后控制台返回111 ,2s后控制台返回222,3s后控制台返回333
function one(){
setTimeout(()=>{
console.log(111)
iterator.next()
},1000)
}
function two(){
setTimeout(()=>{
console.log(222)
iterator.next()
},2000)
}
function three(){
setTimeout(()=>{
console.log(333)
iterator.next()
},3000)
}
function * gen(){
yield one();
yield two();
yield three();
}
//调用生成器函数
let iterator = gen();
iterator.next()//运行函数
//需求2:模拟获取 用户信息=>订单信息=>商品数据
function getUsers(){
setTimeout(()=>{
let data = '用户信息';
//调用next()方法,并且将数据传入
iterator.next(data)
},1000)
}
function getOrders(res){
setTimeout(()=>{
console.log("res;;;;",res)
let data = '订单数据';
iterator.next(data)
},1000)
}
function getGoods(){
setTimeout(()=>{
let data = '商品数据';
iterator.next(data)
},1000)
}
function * gen(){
let users = yield getUsers();
console.log(users);//用户信息
let orders = yield getOrders(users);
console.log(orders);//订单信息
let goods = yield getGoods();
console.log(goods);//商品信息
}
let iterator = gen();
iterator.next();//调用后只会运行gen里面的第一段代码