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

高级迭代器的使用

作者: 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 }

相关文章

  • 高级迭代器的使用

    《深入理解ES6》阅读随笔 迭代器传参 在调用 next() 方法时,可以传递一个参数,该参数可以在上一个 yie...

  • C++boolan part3_week4

    1. 迭代器 1.1 迭代器的种类 使用随机访问迭代器的容器:array, vector,deque使用双向迭代器...

  • java30(JDK1.5新特性)

    可变参数: for循环的高级应用: 其底层还是使用的还是迭代器 静态导入: 静态导入就是导入类中的...

  • Java8 Stream-1

    可以看成遍历数据集的高级迭代器。 和迭代器类似,流只能遍历一次。 代码: 总结:

  • 设计模式(17) 迭代器模式

    迭代器模式 基于IEnumerable的实现 使用场景 迭代器模式的优缺点 迭代器模式 迭代器模式用于顺序访问集合...

  • Iterator迭代器

    前言: Java中的Iterator迭代器是为了对集合进行迭代 迭代器的使用:

  • 迭代器、生成器

    迭代器对象 实现了迭代器协议的对象叫做迭代器对象,迭代器对象可以使用 next 和 __next__ 方法进行迭...

  • Python基础12-函数3(生成器)

    生成器 1 概念 是一个特殊的迭代器(迭代器的抽象层更高级) 拥有迭代器的特性* 惰性计算数据,节省内存* 能够记...

  • Generator(三)

    Iterator高级功能 给迭代器传递参数 可以通过next()方法给迭代器传递参数。当通过next()传递参数时...

  • py3笔记27:迭代器

    1、迭代器 1.1 iter() 1.2 迭代器遍历 1.3 类作为迭代器使用 把类作为一个迭代器使用,需要类中实...

网友评论

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

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