未来のための関数:ジェネレータとプロミスにコメントジェネレータ(Generators)は特殊な種類の関数である。通常の関数が1つの値しか返さないのに対して、ジェネレータは、実行を断続的に中止しながら、複数の値を生み出すことができる。プロミス(Promises)は、JavaScriptに組み込みのオブジェクトであり、非同期処理の取り扱いに適している。ジェネレータ関数ジェネレータ関数は以下のように定義する。ジェネレータ関数の中ではyieldというキーワードを使って値を生成できる。Kusarigama}イテレータオブジェクトでジェネレータを制御するジェネレータの呼び出しはジェネレータ関数の本文の実行を意味しない。その代わりに、イテレータオブジェクトが作成される。このオブジェクトを通してジェネレータとコミュニケーションをとることができる。}イテレータはジェネレータの実行をコントロールするために使用される。イテレータオブジェクトはnextメソッドを持っていて、このメソッドを通してジェネレータに値を要求できる。weaponIterator.next();この呼び出しに対して、ジェネレータはyieldに達するまでコードを実行する。yieldに達すると、その時点での結果を返して、実行を中断する。この結果には、その時点での値(value)と、ジェネレータが完了したか(done)が含まれる。現在の値の生成が終わると、ジェネレータはそこで中断する。イテレータの繰り返しイテレータのnextメソッドを使うことで、ジェネレータに新しい値を要求できる。ジェネレータが次の値を持っているか知るには、結果として取得できるオブジェクトのdoneプロパティを使用する。これらを利用すると、古典的なwhileループでイテレータから繰り返し値を取得できる。Wakizashi}for-ofループは、このループのシンタックスシュガーである。console.log(item);}別のジェネレーターを生成するジェネレータの実行を別のジェネレータに任せたい場合もある。Khanyeild*演算子をイテレータに使うことで、別のジェネレータから値を生成できる。ジェネレータとやりとりするジェネレータから値を生み出すだけでなく、ジェネレータに値を送ることもできる。exceptionジェネレータの内部を探求するジェネレータは小さなプログラムのようなものであり、複数の状態を遷移するステートマシンでもある。ninjaIterator.next();PromiseとやりとりするPromiseは、ES2015で導入された、非同期処理を扱いやすくするための概念である。今は存在せず、将来手に入る値のプレースホルダーである。Hattori});Promiseに渡したコールバック関数(executor)は即時実行される。単純なコールバックの問題を理解する私たちは、長く時間のかかる処理によってユーザの操作を妨げないために、非同期処理を行っている。非同期処理のための最も初歩的な道具はコールバック関数である。処理});このようなタスクの際にはエラーの発生する可能性がある。コールバック関数の問題は、try-catchのような言語の組み込み機能を使えない点だ。以下のコードではエラーはキャッチできない。エラー処理}コールバック関数を呼び出すコードはイベントループの同じステップにはないことが普通だたら、例外処理でキャッチはできず、エラーは失われる。そのため、Node.jsの世界では、コールバック関数にerrとdataの2つの引数が渡されるような慣習が確立されている。errにnullでない値が渡された場合はエラーが発生しているということだ。コールバック関数の第一の問題点はエラーハンドリングの難しさである。長い処理の後には、取得した結果を使って何か処理を行うことが多い。この結果、別の長い処理が開始されることもある。});});このように、連続したステップを実施するのが難しいことが、コールバック関数の第二の問題点である。最終的な結果を得るためのステップが、依存関係にない場合もある。このような場合、実行時間を最適化するためには、並行して処理を行うのが望ましい。並行した処理をコールバック関数で実装するのはかなりトリッキーである(書籍にはコード例があるが、長いので割愛)。コールバック関数の第三の問題点は、並行処理が難しいことである。コールバック関数は、try-catchやループのような言語の組み込み機能と併せて使うことが難しいのも欠点である。Promiseを使ってみるPromiseは非同期に実行するタスクの結果のプレースホルダーである。手に入れておらず、将来入手できる値を意味する。Promiseはいくつかの状態をもつ。Promiseは、Pending状態から始まる。この状態をUnresolvedと呼ぶこともある。プログラムの実行が進み、Promiseのresolve関数が呼ばれると、PromiseはFullfilled状態に移行する。このとき、望んだ値を手に入れることができる。Promiseのreject関数が呼ばれるか、例外が発生し、それがPromiseの中でハンドルされなかった場合、PromiseはRejected状態に移行する。この場合、エラーの内容を取得できる。FullfilledおよびRejectedをまとめてResolved状態とも呼ぶ。一度Resolvedに移行すると、Unresolvedに戻ることはない。↑の実行結果は↓のようになる。Promiseのresolveは即時呼び出しではなく、次のイベントループの実行まで遅延する。HattoriPromiseの却下(reject)Promiseの実行を失敗させる(rejectする)方法は2つある。メソッドを実行するか、ハンドルされない例外を発生させるかである。console.error(error));このように、Promiseの中で発生したエラーを一括して処理する仕組みが存在するのがPromiseの大きな利点である。実行すると新しいPromiseが返る。繰り返すことでPromiseを連鎖させることができる。一括でキャッチできる。複数のPromise依存関係のない複数の非同期処理を並行して実行することもできる。メソッドはPromiseの配列をとり、全てのPromiseが成功したら返る新しいPromiseを作成する。いずれか1つのPromiseが失敗した場合は、Promiseは失敗する。Promsie.raceが利用できる。console.log(ninja);});ジェネレータとPromiseを組み合わせる非同期処理を行うコードをジェネレータの中に置くことで、シーケンシャルな非同期処理をエレガントに書くことができる。}});async関数JavaScriptのasync関数は、前述したPromiseとジェネレータの組み合わせを言語機能化したものである。}})();asyncキーワードを使って非同期関数であることを宣言すると、この中ではawaitキーワードを使って、Promiseがresolveされるのを待つことができる。WordPress.。