generator函数是ES6的语法,最大的特点就是调用一下走一步,即调用一下走一个yield,具体如下:
function* gen() {
yield '第一个'
yield '第二个'
return '结束'
};
let g = gen();
console.log(g); //get {<suspended>}
console.log(g.next()); //{value: '第一个', done: false}
console.log(g.next()); //{value: '第二个', done: false}
console.log(g.next()); //{value: '结束', done: true}
上面的就是一个 Generator函数,跟其他函数不同的就是他是调用一下执行一次,下面的yield会暂停执行,所以函数声明时要加*号,也是跟其他函数的区别;调用next()后返回一个对像,对象的属性value值就是yield后面的执行结果,done是一个布尔值,表示该函数里面的执行语句是否执行完毕。
因为它可以中断执行所以一般用它来执行封装异步操作;可以和外部输入的数据进行交换,也是决定它可以封装异步操作的原因;
next 方法返回值的 value 属性,是 Generator 函数向外抛出数据;next 方法还可以接受参数,这是向 Generator 函数体内输入数据。
function* gen(a) {
let b = yield a + 1
return b
};
let g = gen(1)
console.log(g.next()) //{value: 2, done: false}
console.log(g.next(3))//{value: 3, done: true}
上面第一个next () 返回的value属性是 a + 1的值 (2);第二个next带有参数3,这个参数可以传入Generator函数,作为上个阶段返回的结果,被函数体的变量b接收,因为返回的是3(也就是b的值)
我们可以还可以用for...of...来循环遍历它,他会把next()返回对像的value值输出
function* gen() {
yield '第一个'
yield '第二个'
return '结束'
};
let g = gen();
for(let item of g){
console.log(item)
}
//第一个
//第二个
Generator函数的用法
封装异步数据请求
//以axios为例
//先引入axios
// <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
function* get(a) {
let b = yield 'boo-bey'
yield axios.get(`https://api.github.com/users/${b}`)
};
let g = get()
let user= g.next().value //返回一个用户名,把用户名传进下一个next
console.log(user)
g.next(user).value.then(res=>{
console.log(res)
})
关于异步解决方案:
1)回调函数
2)事件监听
3)发布/订阅
4)Promise对象
**:有错误的欢迎指正