JS.nextスマートフォン用の表示で見るJS.nextJavaScriptの最新実装情報を追うブログこの広告は、90日以上更新していないブログに表示しています。概要Promiseとは非同期処理を上手く扱う為のAPIであり、パターンである。非同期の処理の完了後に続けて処理を行いたいとき、よくコールバックパターンが使われるが、処理が連続するとコールバック地獄と言われる分かりづらいソースコードになってしまう。複数の非同期処理が完了した時に処理を行うなど、コールバックパターンでは難しい事をスマートにできるのがこのPromiseである。Promiseとして仕様策定が進められていたり、ライブラリのDeferredが有名だったが、ES2015標準に入ることになり、V8に実装された。Promise実装やライブラリのDeferredは、よく似ているけれどいくらか仕様が違うということを注意しなければならない。概念部分は共通しているので、それらの解説でも十分参考にはできる。当記事が分かりにくいと感じたら記事末の参考外部リンクを参考にして欲しい。Promiseはとてもシンプルな仕組みなので、実際に何度も使えばすぐ感覚が掴めてくると思う。使い方まず、Promiseコンストラクタに関数を渡して呼び出して、promiseオブジェクトを作る。なり、渡した関数は第一引数に処理が完了した時に呼ぶresolve関数、第二引数に処理が失敗した時に呼ぶreject関数が与えられてすぐに呼ばれる。resolve関数が呼ばれた時、そのpromiseは解決して「解決済」状態となる。1秒後にこのpromiseを解決する})promiseはthenメソッドを持つ。このメソッドに関数を渡すと、promiseが解決していれば間もなくその関数が呼ばれ、未解決ならば解決された後に呼んでくれる。完了状態を気にせず、その処理が終わった後にしたい処理を指定できる。resolveが既に呼ばれている場合か、呼ばれた時に実行される})値を与えてresolveを呼ぶと、その後のthenで受け取れる。ちなみにresolveを何度も呼んでも、有効なのは最初の1回のみである。『2秒経過した』})また、エラーが発生した時や、rejectが呼ばれた時はpromiseは「棄却済」状態になる。「棄却済」になった時の値(エラー)はcatchメソッドで登録した関数まで伝えられる。『エラー』})一度promiseが棄却されると、次のcatchまでその後のthenはスルーされる。どこでエラーが起きても、ちゃんとその後の最初のcatchで処理できる。catchのalertだけ呼ばれるthenの第二引数を使ってcatchの分もまとめて指定することもできる。『エラー』})Promise.resolveを使えば、promise以外の値をその値をもって解決されたpromiseを作れる。Promise.rejectを使えば、その値をもって棄却されたpromiseを作れる。『123』-->thenやcatch中にpromiseが返されるとそのpromiseが以後のthenやcatchの対象になる。promiseでない値が返された場合はpromiseにキャストされて扱われる。3秒間隔で3回ログが出るまたthenでは、ライブラリで提供されているような、「then」という関数を持っている『thenable』オブジェクトをネイティブPromiseのように扱ってくれるので、他のPromise実装と容易に混用ができる。複数の処理が全て終わった所から続けたい場合はPromise.allを、いずれかが終わった後に続けたい場合はPromise.raceを使う。非同期な処理を同期的に書ける関数タイプが実装された。--harmony_static_fieldsはてなブログをはじめよう!boaoaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。