概念
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] 举报,一经查实,本站将立刻删除。