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();

 

posted @ 2021-03-05 20:07  WaterMealone  阅读(53)  评论(0编辑  收藏  举报