generator 的筆記

  1. 有特定的書寫格式。
  2. 返回Iterator接口。
  3. 分段執行函數體。
  4. 結合異步方法使用。

特定的書寫格式

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()方法才執行下一段。不然就不執行。正因其有此特性,才能夠執行一段後執行其它代碼而後再執行下一段。函數

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模塊。fetch

co(readFile())
相關文章
相關標籤/搜索