JS.nextスマートフォン用の表示で見るJS.nextJavaScriptの最新実装情報を追うブログこの広告は、90日以上更新していないブログに表示しています。概要V8でジェネレータ周りの実装が進んできたので、解説してみようと思う。ジェネレータ関数ジェネレータ関数とは、(一つの見かたとしては)処理を途中で一時停止できる関数のことである。呼び出される度に数を順番に返す関数を定義したいとする。12これがジェネレータ関数を用いると次のように書ける。}「function」に続いて「*」を使うことによりジェネレータ関数を宣言できる。ジェネレータ関数を呼び出すと、ジェネレータ(イテレータオブジェクト)が返される。このジェネレータをnextメソッドで進めると、次のyield式まで処理を進め、式の結果の値が返される。「yield」はジェネレータ関数内で有効なキーワードで、式を作る。returnの親戚のようなもので、関数はそこで外部に値を返して、終了する代わりに一時停止する。再開するときに値を受け取るジェネレータのnextメソッドに値を与えると、ジェネレータ関数を再開するときに値を渡す事ができる。渡した値は、yield式の結果の値となる。}ジェネレータ関数で例外が発生したらジェネレータのnextメソッド呼び出し元まで伝わる。"err"エラーが起きた後さらにジェネレータを操作しようとするとエラーになる。Errorジェネレータ関数をエラーと共に再開させるジェネレータのthrowメソッドを呼ぶと、ジェネレータ関数を再開させるときに例外を起こすとができる。(未実装)ジェネレータのreturnメソッドを呼ぶと、ジェネレータ関数が再開され即returnされたように振る舞う。10yield*キーワードyield*キーワードを使うと、値をそのまま返す代わりにイテラブルとして扱い、イテレートされたそれぞれの値に対してyield演算子を使ったのと同じ処理をする。}非同期処理を同期的に扱うここまで見てきたように、ジェネレータ関数は値を一旦返し、任意のタイミングで任意の値と共に再開させることができる。Promiseを返し、外部でその解決を待ってから解決値を与え再開させることで、非同期処理を同期的に記述することができる。})}とあるゲームプレイヤーのソースはこうなる。})}main().catch(ERROR)それまでの結果を利用しようとすると、なかなかネストが避けられない。ネストを避けても、沢山の関数定義が並ぶとあまり読みやすくない。そこで、ジェネレータ関数を受け取り、ジェネレータが返すPromiseの解決を待って、ジェネレータを進める魔法の関数「spawn」を使うとこうなる。「spawn」はジェネレータ関数を受け取って関数を返す。}}返された関数を呼ぶと、ジェネレータ関数を呼んで、例の処理をする。}}更に返される関数が処理結果のPromiseを返すようにしたりするとこんな感じになる。非同期な処理を同期的に書ける関数タイプが実装された。--harmony_static_fieldsはてなブログをはじめよう!boaoaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。