SOURCE

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 命令行工具 X clear

                    
>
console