首页 > Web开发 > 详细

3/4 关于JS 生成器的两个有意思的代码

时间:2021-03-05 22:19:16      阅读:35      评论:0      收藏:0      [点我收藏+]

写在前面

  仅供自用

  ...


 

第一个

  这个是对 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();

 

3/4 关于JS 生成器的两个有意思的代码

原文:https://www.cnblogs.com/WaterMealone/p/14488216.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!