• [ES6] 15. Generators -- 2


    Using for..of statement:

    function* greeting(){
        console.log(`Generators are "lazy"`);
        yield "How";
        console.log(`I'm not called until the second next`);
        yield "are";
        console.log(`Call me before "you"?`);
        yield "you";
        console.log(`Called when "done"`);
    }
    
    let greeter = greeting();
    for(word of greeter){
        console.log(word);
    }
    
    //How
    //are
    //you

    You can see, it ouptu "How are you", because it grabs the value off of the next.

    The same as:

    let greeter = greeting();
    console.log(greeter.next().value);
    console.log(greeter.next().value);
    console.log(greeter.next().value);
    console.log(greeter.next().value);

    Assign the yield to the variable:

    function* greet(){
        let friendly = yield "How";
        console.log(friendly);
        yield "are";
        yield "you";
    }
    
    var greeter = greet();
    console.log(greeter.next().value);
    console.log(greeter.next().value);
    console.log(greeter.next().value);
    
    //How
    //undefined
    //are 
    //you

    When you assign yield to friendly, it doesn't console out "How" but undefined.

    Why undefined?:

    The way that this works is that the next step through the iteration, so if I say "The heck," will basically send this back through and assign it to this friendly. If I log this out now you'll see I get "How," and then "The heck." That means you can start building things through the iteration process.

    Add param to the next():

    function* greet(){
        let friendly = yield "How";
        console.log(friendly);
        yield "are";
        yield "you";
    }
    
    var greeter = greet();
    console.log(greeter.next().value);
    console.log(greeter.next("the hack").value);
    console.log(greeter.next().value);
    
    //How
    //the hack
    //are 
    //you
    function* greet(){
        let friendly = yield "How";
        friendly = yield friendly + "are";
        yield friendly + "you?";
    }
    
    var greeter = greet();
    console.log(greeter.next().value);
    console.log(greeter.next(" the heck ").value);
    console.log(greeter.next(" silly ol'").value);
    
    //How
    // the heck are
    // silly ol you

    Cannot pass the param to the first next():

    function* greet(){
        let friendly = yield "How";
        friendly = yield friendly + "are";
        yield friendly + "you?";
    }
    
    var greeter = greet();
    console.log(greeter.next("first").value);

    It will show error message:

      TypeError: Sent value to newborn generator.

    Because you haven't given this a chance to run and iterate and go to the next step where you could actually pass in a value.

    总之:yield返回的值是下一个next中所传进来的值

    Generators also help you work with infinite sequences:

    function* graph(){
        let x = 0;
        let y = 0;
        while(true){
            yield {x:x, y:y}
            x += 2;
            y += 1;
        }
    }
    
    
    var graphGenerator = graph();
    console.log(graphGenerator.next().value);
    console.log(graphGenerator.next().value);
    console.log(graphGenerator.next().value);
    console.log(graphGenerator.next().value);
    console.log(graphGenerator.next().value);
    console.log(graphGenerator.next().value);
    console.log(graphGenerator.next().value);
    console.log(graphGenerator.next().value);

    I can safely yield this X and Y point knowing confidently that this stuff isn't going to evaluate until the next step through after the yield process.

  • 相关阅读:
    PB调用.NET类库详解
    一个游标的性能问题
    WCF实例与并发的一些测试
    PB调用.NET代码的两个入口函数
    SQL数据库表防JS木马注入
    Atitit 收入理论大总结 4位一体 4象限理论 财政收入理论 6位一体
    Atitit 融资 之道 圈钱之道 attilax总结
    Atitit 组织架构的如何划分 划分方法attilax大总结
    Atitit 每个人都应该实施的互联网金融战略 attilax总结
    Atitit 研发组织与个人如何gdp计算法 attilax总结
  • 原文地址:https://www.cnblogs.com/Answer1215/p/4117501.html
Copyright © 2020-2023  润新知