微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ES起步08----ES6开始之Generator函数

概念
01,Generator(中文意思:生成器)函数ES6提供的解决异步编程的方案之一【yield (中文意思:产出) 就是个状态,也称暂停按钮】
02,Generator函数一个状态机【存在许许多多自定义的状态yield【中文意思:产出】】,内部封装了不同状态的数据【马上请求的数据,正在请求的数据,请求结束的数据等】
03,会生成遍历器对象遍历整个状态机中的所有状态

特点
01,function 与函数名之间有一个星号如:function* genarator() {};
02,Generator函数返回的是一个指针对象,就算存在return value;,那也只是给结束状态一个返回值。
03,所返回的指针对象初始化指向最开始,换句话说就是如果没有调用.next()【无论何种方式如:for…of / obj.next()】,就不会开始执行。
04,暂停函数【惰性求值】,yield可暂停next()可启动,每次返回的是yield后的表达式{value:value,done:true/false}
05,yield语句返回结果认为undefined,当然你可以通过next(arg1)方法传参,参数内容会作为所启动yield语句的返回值

//注意 for...of遍历,for...of模块值走一次
function* Generator() {
	console.log("begin");
	let res = yield 'burningSNow';
	console.log(res);//结束了吗?
	yield '燃情雪';
	console.log("center");
	return "所谓的结束,也许也是一种新的开始吧";
}
//说白了,Generator就是个自我控制的遍历器
let obj1 = Generator();
let num = 0;
obj1.next();
obj1.next("结束了吗?");

应用处理异步问题
原生js

//原生js处理异步
function ajax(url) {
	let request = new XMLHttpRequest();
	request.onreadystatechange = () => {
		if(request.readyState == 4 && request.status == 200) {
			//相应的操作
			//获取到响应体中,下个请求链接,执行第二个yield,并把请求链接返回给第一个yield
			send.next(request.response);
		}
	}
	request.open('get', url);
}
function* send() {
	let url = yield ajax('https://xxxxx');
	yield ajax(url);
}
//实例对象send函数
let send = send();
//发送第一个yield的请求
send.next();

JQ

//JQ处理异步
function ajax(url) {
	$.get(url, (data) => {
		//获取成功回掉函数结果中的下个链接url
		let url = data.url;
		//执行第二个yield,并把请求链接返回给第一个yield
		send.next(url);
	})
}
function* send() {
	let url = yield ajax('https://xxxxx');
	yield ajax(url);
}
//实例对象send函数
let send = send();
//发送第一个yield的请求
send.next();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐