function * gen () { yield 'hello' yield* 'world' yield fn() // fn()必須返回iterable的內容. return 'ending' }
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())