12.Generator函数
概念:
1.es6提供的解决异步编程的方案之一
2.Generator函数是一个状态机,内部封装了不同状态的数据
3,用来生成遍历器对像
4.可暂停函数(惰性),yield可暂停,next方法可启动。每次返回的是yield后的表达式结果
特点:
1.function 与函数名间有一个星号
2.内部用yield表达式来定义不同的状态
例如:
function* generatorExample(){
let result = yeild ‘hello’ //状态值为hello
yeild ‘generator’ //状态值为generator
}
3.Generotor函数返回的是指针对象,而不会执行函数内部逻辑
4.调用next方法函数内部逻辑开始执行,遇到yield表达式停止,返回{value:yeild后的表达式结果/undefined , done: false}
5.再次调用next方法会从上一次停止时的yield处开始,直到最后
6.yield语句返回结果通常为undefined, 当调用next方法时传参内容会作为启动时yield的返回值
//小试牛刀
function* myGenerator(){
console.log('开始执行')
console.log(yield 'hello') //undefined
console.log('继续执行')
console.log(yield 'generator') //hh
console.log('遍历完')
return "返回的结果"
}
let MG = myGenerator() //返回的是指针对象
console.log(MG .next()) //{value:"hello",done:false} //函数执行,遇到yield暂停
console.log(MG .next("hh")) //{value:"generator", done:false} //函数再次启动
console.log(MG.next()) //{value:"返回的结果" ,done:true} //表示函数内部状态已经遍历完毕
//对象的symbol.iterator属性,指向遍历器对象
let obj = {userName:"kobe" , age: 12}
obj[Symbol.iterator] = function* GeneratorTest(){
yield 1
yield 2
yield 3
}
for(let i of obj){
console.log(i)
} //1 2 3
/*案例
1.发送ajax请求获取新闻内容
2.新闻内容发送成功后再次发送请求获取对应的新闻评论内容
3.新闻内容获取失败则不需要再次发送请求
*/
<script src="./jquery-1.11.1.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
function getNews(url){
$.get(url, function(data){
console.log(data)
let url = data.commentsUrl
SX.next(url)
})
}
function* sendXml(){
let url = yield getNews('./news.json')
yield getNews(url)
}
let SX = sendXml()
SX.next()
</script>

本文深入探讨ES6中Generator函数的概念、特点及使用方法,包括如何创建Generator函数、yield表达式的应用,以及如何通过next方法控制函数执行流程。同时,通过实例展示了Generator函数在异步编程中的优势。
1808

被折叠的 条评论
为什么被折叠?



