• [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.

  • 相关阅读:
    【分布式】Zookeeper会话
    【分布式】Zookeeper客户端
    【分布式】Zookeeper序列化及通信协议
    【分布式】Zookeeper系统模型
    【分布式】Zookeeper在大型分布式系统中的应用
    【分布式】Zookeeper应用场景
    【分布式】Zookeeper使用--开源客户端
    【分布式】Zookeeper使用--Java API
    【分布式】Zookeeper使用--命令行
    【杂文】从实习到校招到工作
  • 原文地址:https://www.cnblogs.com/Answer1215/p/4117501.html
Copyright © 2020-2023  润新知