美文网首页日常刻书
高级迭代器的使用

高级迭代器的使用

作者: F_wind | 来源:发表于2021-01-29 13:52 被阅读0次

    《深入理解ES6》阅读随笔

    迭代器传参

    在调用 next() 方法时,可以传递一个参数,该参数可以在上一个 yield 的返回值中得到:

    // 迭代器传参
    console.log("------ 迭代器传参 ------");
    function* iteraterSendHelper() {
      let first = yield 1;
      let second = yield first + 2;
      let third = yield second + 3;
    }
    const sender = iteraterSendHelper();
    console.log(sender.next()); // { value: 1, done: false }
    console.log(sender.next(10)); // { value: 12, done: false }
    console.log(sender.next(20)); // { value: 23, done: false }
    console.log(sender.next(30)); // { value: undefined, done: true }
    

    迭代器异常处理

    在使用迭代器实例过程中,如果遇到异常,可以将该异常抛出,然后在生成器中进行异常捕获:

    // 生成器异常处理
    console.log("------ 生成器异常处理 ------");
    function* iteraterThrowHelper() {
      let first = yield 1;
      let second;
      try {
        second = yield first + 2;
      } catch (error) {
        console.log(error)
        second = 10;
      }
      yield second;
    }
    const thrower = iteraterThrowHelper();
    console.log(thrower.next()); // { value: 1, done: false }
    console.log(thrower.next(2)); // { value: 4, done: false }
    console.log(thrower.throw(new Error("iteraterThrowHelper err"))); // { value: 10, done: false } 
    console.log(thrower.next()); // { value: undefined, done: true }
    

    在上面 second 步骤如果没有使用 try catch 进程异常捕获,那么程序就会由于异常调用而终止运行;

    生成器返回值

    在定义生成器时,在所有 yield 都执行完毕以后,也可以像函数一样,返回一个结果,该结果会在调用 next() 后 done 第一次为 true 时在 value 中得到,如果没有任何返回值或者直接返回不带值,那么此时 value 为 undefined;在生成器中设置返回后,之后的 yield 同时全部失效:

    // 生成器返回值
    console.log("------ 迭代器返回值 ------");
    function* iteraterReturnHelper() {
      yield 1;
      return "1";
      yield 2;
      yield 3;
    }
    const returner = iteraterReturnHelper();
    console.log(returner.next()); // { value: 1, done: false }
    console.log(returner.next()); // { value: "1", done: false }
    console.log(returner.next()); // { value: undefined, done: true }
    console.log(returner.next()); // { value: undefined, done: true }
    

    委托生成器

    在生成器中,还可以像函数调用一样,调用另一个生成器,也就是所谓的委托生成器:

    // 委托生成器
    console.log("------ 委托生成器 ------");
    function* p1() {
      yield 1;
      yield 2;
    }
    function* p2() {
      yield "3";
      yield "4";
    }
    function* iteraterProxyHelper() {
      yield* p1();
      yield* p2();
    }
    const proxy = iteraterProxyHelper();
    console.log(proxy.next()); // { value: 1, done: false }
    console.log(proxy.next()); // { value: 2, done: false }
    console.log(proxy.next()); // { value: "3", done: false }
    console.log(proxy.next()); // { value: "4', done: false }
    console.log(proxy.next()); // { value: undefined, done: true }
    

    相关文章

      网友评论

        本文标题:高级迭代器的使用

        本文链接:https://www.haomeiwen.com/subject/nnuqtltx.html