generatorのノート

1618 ワード

  • には特定の書式があります.
  • は、Iteratorインタフェースを返します.
  • セグメントは、関数体を実行する.
  • は非同期方法と組み合わせて使用される.

  • 特定の書式

    function * gen () {
        yield 'hello'
        yield* 'world'
        yield fn() // fn() iterable .
        return 'ending'
    }
    

    Iteratorインタフェースを返す


    generatorメソッドはIteratorインタフェースを返します.
    function* fib(max) {
      let index = 0
      let [prev, cur] = [0, 1];
      while (index < max) {
        (yield(cur));
        [prev, cur] = [cur, cur + prev]
        index++
      }
    }
    console.log([...fib(15)]) // [ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610 ]
    

    セグメント実行関数ボディ


    generator関数の例は、next()メソッドを実行してこそ、次のセグメントを実行することができる.そうでなければ実行しません.この機能があるからこそ、1つのセグメントを実行した後に他のコードを実行し、次のセグメントを実行することができます.
    function * toggle (init) {
        while (true) {
            yield init
            init = !init
        }
    }
    let g = toggle(false)
    g.next() // { value: false, done: false }
    // other code
    g.next() // { value: true, done: false }
    // other code
    g.next() // { value: false, done: false }
    // other code
    g.next() // { value: true, done: false }
    

    非同期メソッドと組み合わせて使用

    function * readFile () {
        var r0 = yield fetch('url0') // fetch 
        var r1 = yield fetch('url1')
        var r2 = yield fetch('url2')
    }
    

    generatorメソッドのインスタンスは自動的に実行されないため、next()メソッドを使用して実行する必要があります.この例では、このインスタンスが関数体を自動的に実行できることを望んでいます.次にgeneratorインスタンスを自動的に実行する方法(自己実行方法)が必要です.ここではcoモジュールを紹介します.
    co(readFile())