vivipure / TIL

Today I learned
0 stars 0 forks source link

JavaScript Generators #14

Open vivipure opened 2 years ago

vivipure commented 2 years ago

迭代器

JS 中迭代器是指包含 next 方法的对象, next 方法返回一个包含 value 和 done 键值的对象。

a.next() // {value: 1, done: false}
a.next() // {value: 2, done: false}
a.next() // {value: undefined, done: true}

生成器

生成器 是 一种类型的迭代器, 生成器函数返回一个生成器对象,这个对象是可迭代的

function * genFunction() {
     yield 1;
}
const g = genFunction()
g.next() // value: 1, done: false
g.next() // value: undefined , done: true

自定义迭代器

const customIterator = {
    [Symbol.iterator]: function * () {
        let i = 0;
        while(i++ < 10) {
             yield i
       }
    }
}

利用 [Symbol.iterator] 我们可以实现直接的迭代对象,该对象可以通过 for ... in... 进行遍历

yield 传值

当我们在生成器对象next 方法传入参数时,当前的 yield 会变成我们传入的参数

function * listener() {
  while(true) {
     let msg = yield
     console.log(msg)
  }
}
let l = listener()
l.next(1) // 1
l.next(2) // 2

纤程

纤程 是 更小的线程,在JS中,可以通过 generator 实现纤程的效果

TODO:demo

惰性求值

利用yield 结合 无限循环, 我们可以通过其他函数调用生成器函数,生产我们想要的值。实际上函数内部使用了 while(true) 的语法,但是执行线程不会进入死循环,十分的有趣。