現代のJavaScriptのインフラストラクチャの一部として、フロントエンド開発者の観点から非常に重要な約束。これは、非同期の基礎である/構文は、治療非同期のJavaScriptの標準形式である待っています。Web APIの将来は、限り非同期として、になります約束の形で表示されます。
約束/ A +の仕様を達成するための1、
1.1、準備作業
音のためのオープンな標準は、相互運用可能なJavaScriptがhttps://promisesaplus.com約束します
上記のアドレスを介して、あなたは、コンテンツの仕様を表示することができます。
NPMが約束-アプラス・テストをインストールするには、テストスイートをダウンロードすることができます。
NPMの実行テストによって、テストスイートを実行します。
1.2、用語を理解
仕様の最初の部分、いくつかの用語の意味を説明します。
約束は、その後、指定されたメソッド準拠の動作オブジェクトやメソッドの関数です。
thenableは、方法であり、オブジェクトまたは関数を含みます。
JSの値は任意の有効な値です。
例外は、値のthrowステートメントです。
約束は表示が拒否された値である理由。
このセクションでは、上読んで、コードを配置するために実装する必要はありません。
1.3プロミス状態
約束は三つの状態、すなわち、保留中、満たされ、拒否されています。
保留状態では、切り替えることが成就または拒否することを約束します。
満たさ状態では、他の状態に移行することはできません、非変数の値が存在する必要があります。
拒否された状態では、不変な理由がなければならない、他の状態に移行することはできません。
おそらく、上記のようなコードを実装するには:
、満たされ、拒否された保留中の3つの定数がありますが、
プロミスコンストラクタを、そして2つの状態の属性が発生。
状態が満たされた場合、御馳走としての価値を引き起こします。
状態が拒否された場合は、その理由と見なります。
遷移状態遷移関数状態が保留された場合、それだけで、状態遷移であろう。
自由遊びのために実際には、あまりスペース、など。かかわらず、書き込みしようとしている人の、それが唯一の変数名、コードの行数のわずかな違いです。
1.4、そして、方法
約束は、その後のアプローチは、パラメータをonFulfilledとonRejected受け入れなければなりません。
これは、メソッドのプロトタイプを追加し、以下のようなものでした。
onFulfilledと機能のonRejected場合は、最高1回実行する必要があります。
onFulfilledパラメータは、値である理由をonRejectedパラメータの関数です。
この方法は、登録されたグループがonFulfilledおよびコールバックをonRejectedたびに、何度も呼ぶことができます。彼らが呼ばれた場合は、登録順に従って呼び出さなければなりません。
それは、上記のような約束のコールバック・アレイのための新記録です。
その後、この方法は、約束を返す必要があります。
そして、次のようにその豊かな実現:
次にこの方法では、新たな約束(f)は、その後、約束の要件を満たすように返す必要があります戻ります。
状態が保留状態にある場合には、コールバックリストに格納されています。
状態が保留状態でない場合には、それがに対処するためにhandleCallbackをスローします。
何handleCallbackはいについて。重要ではありません、私たちはそれが存在しなければならないことを知っておく必要があります。私たちは、その関数が死んで書かれた、または補助機能の外側にされていない、いくつかの処理を行い得ました。
setTimeoutメソッドがそれを設定する理由については?
それ以来、重要な制約がある方法は次のとおりです。
onFulfilledまたはonRejected実行コンテキストスタックは唯一のプラットフォームのコードを含むまで呼ばれてはいけません。
私たちは、JSエンジンレベルでの約束を実現していないが、使用JSは、JSの約束を達成するために。JSは、独自の実行コンテキストスタックのアクティブ制御ではありませんでした。私たちは、間接的などのAPIのsetTimeout / nextTickを経て、ここでのsetTimeoutを選択することができます。
その後、この方法はまた、自分自身の状態と結果を持って、約束を返します。彼らはonRejectedの任命や行動をonFulfilledます。
これは、一部の操作を行いhandleCallbackです。
handleCallback関数は、状態の状態に応じて、判定は、歩行経路またはパス拒否満たされます。
まずonFulfilled / onRejectedかどうかの関数であり、そうであれば、次の結果として彼らの価値、約束を返すように決定します。
そうでない場合は、次の結果の約束として、現在の約束の直接の結果。
onFulfilled /実行プロセスがエラーを投げonRejected場合、このエラー、約束の下で拒否された理由は、使用するとして。
方法は、次いでコアが結果の約束の下で構成されている使用します。
私たちのコード、ほとんど余分な処理ロジック、忠実な完全な仕様は、動作を指定します。
1.4、約束の解決手順
上のスクリーンショットから、我々は約束決議プロシージャの引数を参照してください。
これは、いくつかの特別な値である場合、特別な治療を行うために、解決することが記載されています。この特別な治療、また、明示的に記述仕様。
結果は、現在の約束自体である場合、最初のステップは、それは例外TypeError。
結果は別の約束である場合に、第2のステップは、そのステータスの状態及び結果に従います。
第3のステップは、場合、結果はthenableオブジェクトです。その後、最初の関数を取る関数呼び出しは、約束の解決手順プロセスを再入力してください。
最後に、上記の場合は、結果の約束となった結果、そうではありません。
上記のように、コードを描くことによって、注文書は、IF 3の調製を記載します。
最初の判定結果が約束そのものではない、それはTypeError例外を投げることです。
第二の決意の結果は、その値又は理由を取る(解決、拒否)次に呼び出され、約束のタイプではありません。
第三決意の結果は、最初に取り出され、その後、新しい約束ザ・プロミス解決手順手順に入り、thenableオブジェクトではありません。
そうでない場合には、結果を直接解決します。
1.5、積分の残り
これまでのところ、すべての重要な部分は、処理されました。
1)我々は、単一の約束の状態遷移への移行を持っています。
2)当社はhandleCallback、状態が現在と次の約束の間の約束に合格しています。
3)私たちはresolvePromise、特別な特別な治療の結果を持っています。
次に、私たちはすべて一緒にそれを置くために、あなたは様々な部品をリンクすることができます必要があります。
ここで、プロミスコンストラクタ、拡張以下:
状態を拒否onRejectedに切り替えるように構成され、状態に切り替えるように構成満たさOnFulfilled。
設定と解決機能に機能を拒否解決、resolvePromiseによって検証される値。
このフラグを無視して、アクションへのコールを1つだけ拒否/決意を確保します。
最後に、解決/関数fに渡されたパラメータとして拒否。
f関数の実行エラー場合は、エラーが拒否の理由として使用されます。
状態の変化は、すべての非同期コールバックをクリア膨張の関数として変化。
我々はhandleCallbackを達成している前に、1サイクルのみhandleCallbacksを達成。
テストスイートを実行した後、すべてが合格します。
1.6、ES2015の約束
ES2015の約束と約束/ A +の仕様は、完全に同等ではありません。明細書中の+は、キャッチ方法、静的方法及びPromsie.resolve、Promise.reject、Promise.all、Promise.race等が記載されていません。
でも、新しい約束はこの使用方法は、A +の標準の内容ではありませんが、今はただES2015を達成するためのスタイルをお約束します。
互換性のES2015は約束/ A +の仕様を約束し、自分自身の拡張を行います。
その後、この方法では、我々は簡単に拡張するいくつかの方法のES2015の約束を実現することができます。
法と実現キャッチ解決/は、上記の静的メソッドを拒否します。Promise.allとPromise.raceの実現
2.2は、非同期コールバックプログラムより高度であることを約束しますか?
コールバック - >約束 - >発電 - >非同期/のawait
2.2.1のコールバックスタイルに属しても約束
最初の段落の約束/ A +の仕様では、我々は明確な声明を見ることができます:
その後、コールバックを登録する方法で約束し、前記onFulfilledコールバックプロセス値、プロセスonRejectedコールバック理由。
コールバックスタイルは、種類は、一般的にnodejsエラー・ファーストコールバック、またはその他の生のコールバックを指します。
2.2.2は、ジェネレータ関数も、コールバックスタイルです
ベースジェネレータ+同期書込みを用いて実施することができる非同期溶液の約束は、実際に非同期コードを書きます。例えば、コTJライブラリと:
-
co(function* () {
-
var result = yield Promise.resolve(true);
-
return result;
-
}).then(function (value) {
-
console.log(value);
-
}, function (err) {
-
console.error(err.stack);
-
})
2.3、非同期/非同期の究極のソリューションを待ちますか?
人々は、非同期を待つ/非同期は究極のソリューション、任意の次元で説明した究極の尺度であると言うとき、私はよく分かりません。
2.3.1ジェネレータ関数は非同期機能よりも普及しています
セマンティックと標準化は、エンパワーメントを意味するものではありません、それはまた、心神耗弱につながることができます。
非同期/心神耗弱のケースを待っています。
同期動作をサポートすることができ、また、非同期動作をサポートするために発電機能。
非同期関数は非同期動作をサポートしています。
コtjのライブラリについては、約束ですが、それがメインの非同期のデータ・ソースですが、結果を他のソースからの非同期データを取得co'll。たとえば、機能をサンク。
前述したように収率が機能サンクとき、渡さCO。のスタイルは、このコールバック関数を行ってnodejs。
必要に応じて、我々はまた、観察降伏rxjsおよびその他のオブジェクトをサポートすることができます。
COは、所望の拡張機能を実現するために、できるだけ多くのジェネレータ関数のすべての特性を利用することができライブラリであるためです。
新しい構文を待つ/非同期は、それが標準化された基礎の上に構築されている必要があり、それは同じ意味を持っている必要があります。それは明確な意味論と引き換えに、非標準のオブジェクトのサポートをドロップすることで、選択肢の多くを行う必要があります。
共に比べ容量を低減するようにこのように、非同期/のawait非同期データ結果のみが、被写体の約束から得ることができます。
非同期/のawaitよりも柔軟2.3.2ベア書かれた約束
非同期シーンの下で90%以上は、非同期/のawait有能であってもよいが、しかし、いくつかのシーンがあり、裸の約束は、より柔軟な書き込みます。
最も典型的なケースは、並列処理の約束です。
上記、常にシリアルキーワード、我々は、Bを得るためにしたい場合、アップ書き込みは非常に簡単です待っています。我々が得ると同時にB、および結果を待ちたい場合は、キーワードの取り扱いが困難であった待っています。
我々は、単一のパッケージに、それ自体で約束を複数Promise.allています。
あった提案は、シンタックスシュガーのPromise.allとして、。しかし、私は着陸を取得できませんでしたawait*
慎重に考えて、数字の練習は、それが困難な着陸である理由を理解するのは簡単です。Promise.all組み合わせの約束の唯一の1つの組み合わせは、Promise.raceは、ようにそこPromise.allSettled。
シンボルが構文糖として各組み合わせに割り当てられている場合、より困難なコードを読み取ります。
そのため、あなたは複数の約束を結合する必要がある場合に、約束が必要な措置を裸が、書き込みです。
それが格納されて送信することができないので、さらに、非同期は/、文法、ない値を待ちます。そして、約束のオブジェクトは、メモリ内に格納することができる、機能のパラメータとして渡すことができます。
この柔軟性は、いくつかの特別なシーンで、利便性をもたらすことができます。例えば、我々は非同期約束をキャッシュすることで結果をキャッシュすることができます。
>約束のマッピング - 上記のように、我々はマップ、店舗のURLを作成しました。各タイムURLは、チェックがキャッシュされます。
非同期によって/文法を待って、その後、約束のオブジェクトが非表示になります。私たちは得ることができません。アップおよびその他の結果が返され、キャッシュURL - >マッピングの結果。
しかし、このアプローチは、カバレッジボイドをキャッシュされます。プロセスは要求が引き金得るが、結果がで到着し、複数の同一の要求をトリガしていない場合は、これらの要求がキャッシュにヒットすることはできません。
私たちは約束した場合、キャッシュされたオブジェクトである、オブジェクトは特性メソッドの約束を使用して、その後複数回呼び出すことができ、我々はすべての結果を得るために、非同期リクエストでURLを取得できます。
2.3.3ベア書き込みコールバックは、約束よりも柔軟です
だけにして支援の約束はonFulfilledと2種類のコールバックパスをonRejected、それはすべての可能なパスのためのコールバックを簡素化するために属します。
前述rxjs、観察者及び加入者が{次に、エラー、完全} 3つのコールバック経路を有するような、約束以上のケースを扱うことができます。
手動でコールバックを管理する場合は、理論的には、我々はより強力との約束よりも柔軟性を行うことができます。
例えばcyclejsはrxjsのような観測とイテレート可能オブジェクトの実現に、著者callbagモード、複数のコールバック関数の組み合わせのみによって提案されました。
興味がある学生はcallbagを学ぶために上記のリンクを訪問することができます。
callbagに触発され、あなたが同様のパターン、内部再構成を使用しているV7.0のバージョンはrxjs。彼らは、機能的な観測、このモードを呼び出します。
私たちは、非同期が/待って、見ることができますが、1つの式が最も弱いの容量で、コールバックは最強の一つです。
非同期JavaScriptプログラムの進化の歴史:
生のコールバックスタイル - >約束コールバックスタイル - >ジェネレータコールバックスタイル - >非同期/待ってコールバック
ない成長過程を表現する能力が、成長過程の開発者の使いやすさ。
Rxjsコールバックスタイルをサポートそこにはシンタックスシュガーがなく、初心者に優しいで有名な、オペレータ非常に多くあるため、主流になるプログラムすることは困難でした。
Callbagスタイルも、ソースコードが読み取りを助長されていません、より人間です。のみ、適切なライブラリ/フレームワークの中に隠さ経験豊富な開発者によって書かれました。
価格で2.3.4シンタックスシュガー
これまでのところ、我々は非同期/のawait文法はシンタックスシュガー以上のコールバック関数の組み合わせとして見ることができる知っている、あなたは私たちが書く非同期コードの複雑さを簡素化することができます。
しかし、それはコストがないわけではありません。
JSコンパイラは、キーワードを識別するために、正確なスローエラー処理の違いの非同期および同期スロー誤りであることを、シナリオを大量に処理する必要があります。/待っていますが、一般的な調整機能を整理非同期を作るための作業を調整するためにトロフィーに発電機能を動作します。
非同期/ターン中+ジェネレータ関数の新しい組成非同期ジェネレータ関数、非同期発電機が待っています。
上記のように、非同期発電+文法をするために、待つ、我々は同時に非同期/のawait非同期処理能力、および複数の値の発電出力を得ることができます。
JavaScriptでは、機能の多くの種類があります。
1)普通機能正常な機能2)矢印の関数function 3)ジェネレータ関数ジェネレータ関数4)、非同期関数非同期関数5)非同期矢印関数非同期関数矢印6)非同期発電機機能非同期ジェネレータ機能矢印
私たちは、常に新しい機能の種類と構文であり、反復最適化コンパイラは、大きな課題を提示するだけでなく、ECMAScriptの言語の新機能が問題となります。だから我々は、非同期矢印機能を見ることができますが、発電機の矢印機能だけでなく、非同期ジェネレータ矢印機能を見ていません。
より多くの機能の種類を追加するために、将来的に、関数型前の順列及び組合せを用いて、数がますます困難になる機能の様々なタイプのを調整するために、より多くなります。
上記の特徴説明代数効果高化言語を含む紙は、代数的効果ハンドラによってなどではなく、言語の構文のライブラリとして提供待つ/非同期を含む多くの機能をシミュレートすることができます。大幅コンパイラの負担を増加させません。
今後のサスペンス特性、代数の影響をシミュレートするために、よりハック方法の一部でJSによってその中に上記の機能を、すなわち使用を反応させます。電力要件が機能をレンダリング損なうことなく、同じ時間に、レンダリング機能で非同期の結果を得るためのawait非同期操作を必要とするだけでなく、いくつかの方法によって達成することができません。