1. generator初识
作用
generator用来控制函数执行,使之在执行中可以在指定的位置暂停下来
使用方法
//定义个generator函数
function *show(){
alert(1);
yield;
alert(2);
}
var obj = show(); //返回generator对象
console.log(obj);
obj.next(); //执行该show函数,并在yeild的位置停下来,若没有yeild,则执行该函数直到结束,此处alert(1)
obj.next(); //alert(2)
说明
- generator函数的声明的方式:function * 函数名() { … }
- 直接调用generator函数并不能运行该函数,而是返回一个generator对象
- yeild 的位置便是函数执行暂停的位置
- generator函数的返回值得next方法可以使的定义的show函数进一步执行
2. yeild的传参与返回值
形式
let param = yeild 返回值
例子
function *show(a, b){
console.log('a, b:', a, b) //a, b: aaa bbb
let c = yield 12;
console.log('c:', c); //c: 888
return 666;
}
var obj = show('aaa', 'bbb');
let res1 = obj.next();
console.log('res1:', res1) //res1: {value: 12, done: false}
let res2 = obj.next(888);
console.log('res2', res2); //res2 {value: 666, done: true}
说明
- generator函数的参数是在调用函数时候传入的
- ‘yeild 返回值’ 是generator对象调用next方法停止后对该next方法的返回值
- ‘let 参数 = yeild’ 是在generator对象调用next方法开始继续执行yeild之后的代码时候,对其传的参数
- 记忆:函数本来就有接受参数和返回值的功能,所以generator对象调用的第一个next只能接收返回值,不能进行传参;generator对象的最后一个next方法只能对yeild只有的执行传参,其接收的返回值就是该generator函数的return的返回值
3. 使用场景
当一个异步调用依赖另一个异步调用的完成时候,原始的写法为:
function show1() {
$.ajax({
url: 'data/text1',
dataType: 'json',
success(){
$.ajax({
url: 'data.text2',
dataType: 'json',
//...
})
}
})
}
上述写法嵌套太深,代码看起来很复杂,不推荐,使用generator的写法为:
function *show2() {
let ret1 = yield $.ajax({url: 'data/text1', dataType: json});
let ret2 = yield $.ajax({url: 'data/text2', dataType: json});
}
let obj = show();
let ret1 = obj.next();
let ret2 = obj.next(ret1);
4. 演变 ES7 async-await
因为genenrtor函数调用的时候要通过函数返回的generator对象的next方法,调用时候不方便,官方则将其统一起来,写法如下:
async function show() {
// let ret1 = await 异步操作1;
let ret1 = await $.ajax({url: 'data/text1', dataType: json});
// let ret2 = await 异步操作2;
let ret2 = await $.ajax({url: 'data/text2', dataType: json});;
}
show();