本記事は一人アドベントカレンダー企画の一つです。
30代未経験エンジニアが25日後にJavaScriptをマスターするカレンダー
JAVASCRIPT.INFOを元にJavaScriptを勉強していき、そこで学んだ知識をアウトプットしていきます。
25日でJAVASCRIPT.INFOをやりきり、未経験エンジニアがJavaScriptをマスターする過程を投稿していきます。
12.1 ジェネレータ
知らない単語
- データストリームとは
- データの入出力の経路や入力・出力それぞれにおけるデータの流れそのもの
学んだこと
ジェネレータは、要求に応じて複数の値、または無限の数の値を返すことができる
- ジェネレータ関数
ジェネレータを作成するには、特別な「function*」、ジェネレータ関数を使用する必要がある
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
generateSequence() が呼ばれたとき、コードは実行されず、代わりにジェネレータを返す
ジェネレータオブジェクト作成時に、処理は最初の部分で一時停止し、
ジェネレータのメインのメソッドであるnext()呼ばれると、最も近い yield 文まで処理を再開する
- yield 演算子
ジェネレータ内部にのみ yield 演算子が存在する
外部のコードとジェネレータは nextとyield 呼び出しを通して結果をやり取りすることができる
ジェネレータは処理中に呼び出しコードとデータをやり取りする関数の機能が便利である
感想
ジェネレータではfunction*で表す、ジェネレータ関数 と yieldがとても重要だとおもうが、次の章で非同期との関係性についても学ぶと思うので、難しいがしっかり覚えたい。
12.2 非同期イテレーションとジェネレータ
知らない単語
- チャンクとは
- 大きなデータを分割して制御情報を付加したひとまとまりの断片などの事
学んだこと
非同期イテレーションを使用すると、要求に応じて非同期に来るデータに対して反復処理することができる
- 反復可能(iterable)を思い出してください
オブジェクトに 反復する機能 を追加する時、
Symbol.iterator というメソッドを使って実装できる
このメソッドはループが開始されたときに for..of で呼び出され、next メソッドをもつオブジェクトを返す必要がある
イテレーションのたびに、メソッドが実行され、値を取得する
next() は {done: true/false, value:} の形式の値の返却が必要で、done:true はループが終わりであることを意味する
- 非同期の反復可能
オブジェクトを非同期的に反復可能とするには、
Symbol.iterator の代わりに、Symbol.asyncIterator を使用する
next() は promise を返さなくてはならない
async が処理し、 async next() とできる
このオブジェクトをイテレートするには、for await (let item of iterable) ループを使用する
await も使用する
感想
非同期処理の所でも学んだが、イテレーションのたびに、メソッドが実行され、値を取得するという処理など、今一度ループ処理を思い出し、sync/awaitを絡めた処理も忘れないようにしたい。
最後に
ジェネレータはjavascriptの中では、そこまで多用されるわけではないようだが、使うべき所が来た時すぐに思い出せるようにしておく。