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