LoginSignup
1
0

More than 1 year has passed since last update.

[Day18] ジェネレータ, 高度なイテレーション

Last updated at Posted at 2022-12-17

本記事は一人アドベントカレンダー企画の一つです。
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の中では、そこまで多用されるわけではないようだが、使うべき所が来た時すぐに思い出せるようにしておく。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0