ES6中Iterator 接口与 Generator 函数以及遍历器对象的 return(),throw()使用

Posted 水香木鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6中Iterator 接口与 Generator 函数以及遍历器对象的 return(),throw()使用相关的知识,希望对你有一定的参考价值。

Iterator 接口与 Generator 函数

Symbol.iterator()方法的最简单实现

let myIterable = 
  [Symbol.iterator]: function* () 
    yield 1;
    yield 2;
    yield 3;
  
;
[...myIterable] // [1, 2, 3]

或者采用下面的简洁写法

let obj = 
  * [Symbol.iterator]() 
    yield 'hello';
    yield 'world';
  
;

for (let x of obj) 
  console.log(x);

// "hello"
// "world"

上面代码中,Symbol.iterator()方法几乎不用部署任何代码,只要用yield 命令给出每一步的返回值即可。

遍历器对象的 return(),throw()

遍历器对象除了具有next()方法,还可以具有return()方法和throw()方法。如果你自己写遍历器对象生成函数,那么next()方法是必须部署的,return()方法和throw()方法是否部署是可选的。

return()方法的使用场合是,如果for...of循环提前退出(通常是因为出错,或者有break语句),就会调用return()方法。

如果一个对象在完成遍历前,需要清理或释放资源,就可以部署return()方法。

function readLinesSync(file) 
  return 
    [Symbol.iterator]() 
      return 
        next() 
          return  done: false ;
        ,
        return() 
          file.close();
          return  done: true ;
        
      ;
    ,
  ;

上面代码中,函数readLinesSync接受一个文件对象作为参数,返回一个遍历器对象,其中除了next()方法,还部署了return()方法

下面的两种情况,都会触发执行return()方法。

// 情况一
for (let line of readLinesSync(fileName)) 
  console.log(line);
  break;

// 情况二
for (let line of readLinesSync(fileName)) 
  console.log(line);
  throw new Error();

上面代码中,

  1. 情况一输出文件的第一行以后,就会执行return()方法,关闭这个文件;

  2. 情况二会在执行return()方法关闭文件之后,再抛出错误。

注意,return()方法必须返回一个对象,这是 Generator 语法决定的。

throw()方法主要是配合 Generator 函数使用,一般的遍历器对象用不到这个方法。

以上是关于ES6中Iterator 接口与 Generator 函数以及遍历器对象的 return(),throw()使用的主要内容,如果未能解决你的问题,请参考以下文章

es6-Iterator与for...of

使对象具有ES6中Iterator接口的实现方法

ES6 Iterator

ES6-Iterator

es6之iterator

ES6(Iterator 和 for...of 循环)