この記事は以下の書籍を参考にして執筆しました。
#ジェネレータ関数
##ジェネレータ関数を定義する
//どれでも可
function *myGenerator(){}
function * myGenerator(){}
function* myGenerator(){}
##ジェネレータ関数と普通の関数の違い
###yield
- 処理を中断しreturn文同様、外側に値を渡す。
- return文と異なり式であり、関数内で後から使用する値を取得できる
function* myGeneratorFunction() {
const message='Hello'
const response=yield message //外側のプロセスからの値を捕捉
}
yieldが出現したところで中断して、valueとdoneプロパティを持つオブジェクトを返すして、外側のプロセスから再開の合図が来るのを待つ。
その時に外側から値が渡された場合はレスポンスとしてここで補足する。
function* myGeneratorFunction() {
console.log('スタート')
let revievedA = yield 'a'
console.log('revievedA:', revievedA)
let revievedB = yield 'b'
console.log('revievedB:', revievedB)
}
const myGen = myGeneratorFunction()
let gotA = myGen.next('引数0') //スタート
console.log('gotA:', gotA) //gotA: {value: "a", done: false}
let gotB = myGen.next('引数1') //revievedA: 引数1
console.log('gotB:', gotB) //gotB: {value: "b", done: false}
let gotC = myGen.next('引数2') //revievedB: 引数2
console.log('gotC:', gotC) //gotC: {value: undefined, done: true}
最初のnext呼び出しで'引数0'
が使われていない
これは最初のnext呼び出しがそれ以降の呼び出しのようにyieldに関連付けられていないから
最初の呼び出しはジェネレータを初期状態から呼び起こすためのもの。
初期値を渡すなら通常の関数パラメータを使用する
function* myGeneratorFunction(val) {
//...
}
const myGen = myGeneratorFunction('引数')
では一つ一つ見ていく
const myGen = myGeneratorFunction()
ジェネレータ関数が呼び出され、新しいジェネレータオブジェクトが返される。
ジェネレータ関数内のコードはまた実行されない。
let gotA = myGen.next('引数0')
1つ目のnext呼び出しで1つめのyieldまでのコードが実行される。
yieldに渡された値はnext呼び出しから返されるオブジェクトのvalueプロパティになる
let gotB = myGen.next('引数1')
2つ目のnextで、実行を中断したところから2つ目のyieldまでのコードを実行
let gotC = myGen.next('引数2')
doneプロパティにtrueが設定される。