小demo学习生成器

generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。

generator和函数不同的是,generator由function*定义(注意多出的*号),并且,除了return语句,还可以用yield返回多次。

// 生成器可以暂停函数的运行
// 可以通过yield 产出对应的值(由next参数决定)
// 传出的值是z字型的方式
// 生成器 + 执行器函数 就是async
function* test() {
  let value1 = yield 1;
  console.log(value1);
  let value2 = yield 2;
  console.log(value2);
  let value3 = yield 3;
  console.log(value3);
  let value4 = yield 4;
  console.log(value4);
}
let iter = test();
console.log(iter.next("one")); // {value: 1, done:false} // two
console.log(iter.next("two")); // {value: 2, done:false} // three
console.log(iter.next("three")); // {value: 3, done:false} // four
console.log(iter.next("four")); // {value: 4, done:false} // undefined
console.log(iter.next()); // {value: undefined, done:true}

// 重写迭代器接口
let obj = {
  a: 1,
  b: 2,
  c: 3,
  [Symbol.iterator]: function* () {
    let index = 0;
    let map = new Map();
    map.set("a", 1);
    map.set("b", 2);
    map.set("c", 3);

    let mapEntries = [...map.entries()];
    while (index < mapEntries.length) {
      yield mapEntries[index++];
    }
  },
};
for (let i of obj) {
  console.log(i);
}
// ['a', 1]
// ['b', 2]
// ['c', 3]

 

posted @ 2021-10-21 18:29  jerryfish  阅读(65)  评论(0编辑  收藏  举报