Generator 函数
ES6提供的一种异步编程解决方案。通过yield标识位和next()方法调用,实现函数的分段执行。
function* helloGenerator() {
yield "hello";
yield "generator";
return;
}
var h = helloGenerator();
console.log(h.next());//{ value: 'hello', done: false }
console.log(h.next());//{ value: 'generator', done: false }
console.log(h.next());//{ value: 'undefined', done: true }
迭代器(Iterator)
var obj={
0:"rrr",
1:"444",
//实现[Symbol.iterator]属性方法
[Symbol.iterator]:function(){
const self = this;
let index=0;
return {
next:function(){//实现next
if(index<2){
return {//遍历中
value:self[index++],
done: false//表示遍历没有结束,done设置为fasle
}
}else{
return{//遍历结束
value:undefined,//结束后,返回undefined
done: true//done设置为true,表示遍历结束
}
}
}
}
}
};
for(var value of obj){
console.log(value);//"rrr","444"
}
每次遍历都会调用该对象的[Symbol.iterator]属性的next方法,当返回{value: undefined, done: true}后,表示遍历结束。
1、return()方法:执行return()方法后就返回done:true,Generator 函数遍历终止,后面的yield 3不会再执行了。与next()方法一样,return()也可以带参数。
2、next()方法:每执行一次next(),相当于指针移动到下一个yield位置(yield实际就是暂缓执行的标示)
区别
Generarot对象是支持for-of循环的,也说明Generator函数在原型上实现了迭代器接口,上面调用的next()方法其实就是迭代器的next()方法。
注意:yield* 后面只能适配Generator函数。
解决:
- 回调地狱
- 异步流控
参考:https://blog.csdn.net/tcy83/article/details/80343951