function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
var hw = helloWorldGenerator();
console.log(hw.next());//第一次调用 Generator函数开始执行,直到遇到第一个yield表达式为止
//next方法返回一个对象,它的value属性就是当前yield表达式的值
//done属性如果为false 表示遍历还没有结束.
console.log(hw.next());
console.log(hw.next());//第三次返回的是 return语句的表达式值. done属性为true . 表示遍历已经结束.
console.log(hw.next());//第四次 只返回done属性为true.以后的next方法 都是这个返回值.
//***********可以不用yield表达式,这时变成一个单纯的暂缓执行的函数***********//
function* f() {
console.log('executed');
}
var generator = f();
setTimeout(() => { generator.next() }, 2000)
//----------next方法的参数----------//
function* f() {
for (var i = 0; true; i++) {
var reset = yield i;
console.log('reset : ' + reset)
if (reset) { i = -1; }
}
}
var g = f();
console.log(g.next());
console.log(g.next());//如果next方法里面没有参数,每次运行到yield表达式,变量reset的值总是undefined
console.log(g.next(true));//当next方法带一个参数true时,变量reset就被重置为这个参数(即true)
console.log(g.next());
console.log(g.next());
function* dataConsumer() {
console.log('Started');
console.log(`1. ${yield}`);
console.log(`2. ${yield}`);
return 'result';
}
let genObj = dataConsumer();
genObj.next();
genObj.next('a');
genObj.next()
//-----------for...of 循环-------------//
function* foo() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
return 6;
}
for (let v of foo()) {
console.log(v)
}
//一旦next方法返回对象done属性为true,循环就会终止,缺不包含该返回对象.
//所以上面代码中的return语句返回的6 不包括在for...of循环中.
function* fibonacci() {
let [prev, curr] = [0, 1];
for (; ;) {
yield curr;
[prev, curr] = [curr, prev + curr];
}
}
for (let n of fibonacci()) {
if (n > 10000) break;
console.log(n);
}
//遍历对象的方法
function* objectEntries(obj) {
let propKeys = Reflect.ownKeys(obj);
for (let propKey of propKeys) {
yield { key: propKey, value: obj[propKey] };
}
}
let jane = { first: 'Jane', last: 'Doe' };
for(let {key,value} of objectEntries(jane)){
console.log(`${key}: ${value}`);
}
console