generatorのノート
特定の書式
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())