generator

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) 
说明
  1. generator函数的声明的方式:function * 函数名() { … }
  2. 直接调用generator函数并不能运行该函数,而是返回一个generator对象
    generator函数调用返回值
  3. yeild 的位置便是函数执行暂停的位置
  4. 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}
说明
  1. generator函数的参数是在调用函数时候传入的
  2. ‘yeild 返回值’ 是generator对象调用next方法停止后对该next方法的返回值
  3. ‘let 参数 = yeild’ 是在generator对象调用next方法开始继续执行yeild之后的代码时候,对其传的参数
  4. 记忆:函数本来就有接受参数和返回值的功能,所以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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值