zoukankan      html  css  js  c++  java
  • 3/4 关于JS 生成器的两个有意思的代码

    写在前面

      仅供自用

      ...


    第一个

      这个是对 yield * 迭代 的一个不是很好理解的例子

      主要是 想到了 阻塞

    function *test_1(){
        console.log("value:",yield *[1,3,4]); 
        // yield * 阻塞了前面console.log的执行,等到 yield * [1,3,4] 迭代完成之后 才会将 console.log 输出
        // 而 下面的 for-of 迭代的对象是 每个 yield 后面的值 即 每个next()得到返回对象{ done:false,value:1}... 中的value值
    }
    
    for (const iterator of test_1()) {
        console.log(iterator); // 1 3 4  value:undifined
    }

    第二个

      这个有点难度 如果没有 “实例化一个 g 或者是 gTest ” 直接 throw 错误的话 可以试一试

    function *test_2(){
        try{
            yield *[1,2,3]; // 如果抛出错误 yield 1 2 3 都没效 直接到 catch 块里面
        }catch(e){}
    }
    let g = test_2();
    console.log(g.next()); //  {value: 1, done: false}
    g.throw("123");
    console.log(g.next()); //  {value: undifined, done: true}
    
    function *test_3(){
        for (const x of [1,2,3]) {
        try{
            yield x; // 如果抛出错误 yield X 没效 直接到 catch 块里面 但是接下来的 yield 会有效
        }catch(e){
            // console.log(e);
        }
    }
    }
    let gTest = test_3();
    console.log(gTest.next()); // {value: 1, done: false}
    gTest.throw("123");
    console.log(gTest.next()); // {value: 3, done: false}
    
    console.groupEnd();
    Let it roll
  • 相关阅读:
    高并发 内核优化
    mysql 读写分离
    Jmeter使用入门
    Jenkins+Jmeter+Ant接口持续集成
    Android客户端稳定性测试——Monkey
    SVN客户端项目递归删除.svn目录
    Windows 下 php5+apache+mysql5 手工搭建笔记
    熟悉常用的Linux操作
    C语言文法
    词法分析实验报告
  • 原文地址:https://www.cnblogs.com/WaterMealone/p/14488216.html
Copyright © 2011-2022 走看看