ルアンYifengのES6 ---約束オブジェクト

オリジナルリンク:http://www.imooc.com/article/20580?block_id=tuijian_wz

約束の意味
の約束は、より合理的かつ伝統的なコールバック関数とイベントよりも強力なソリューション、非同期プログラミングです
彼は最初ES6その標準書き言葉、統一された用法、元のオブジェクトを提供するために、約束、コミュニティとリアライズによって提案されました。
いわゆる約束は、それは単に将来(通常は非同期動作)結果にいつか終わるイベントを保持するコンテナであり、文法的に言えば、オブジェクトは、あなたがそれの非同期操作からメッセージを取得することができます約束し、約束均一なAPIを提供し、非同期操作の様々な同じように扱うことができます。
特長は、オブジェクトを約束し
、成就、(成功)(失敗)拒否(進行中の)保留中の三つの状態が存在する、オブジェクトが非同期操作を表し約束し、(1)外部の影響からオブジェクトの状態を。;唯一の「コミットメントがあれば、」あなたは親切現在の状態で、他の操作が名前の由来の約束である。この状態を、変更することはできませんかを決めることができ、非同期操作の結果
(2)状態変化がいつでも変更されることはありませんしたらこの結果、件名を変更するには、国家の約束を得ることができる、唯一の2つの可能性があります保留から保留中の変更から拒否に、成就となります。そして、あなたは(確定)解決と呼ばれます。変更が発生した場合は、約束のコールバック関数にオブジェクトを追加し、すぐにイベント(イベント)が完全に異なっているである、この結果を取得する、イベントの特徴は次のとおりです。あなたはそれを逃した場合は、耳を傾けて行くの結果ではありませんA。

プロミスオブジェクトと、プロセスは同期動作と非同期動作が深くネストされたコールバック関数を回避するために、発現させることができます。さらに、プロミスオブジェクトは、統一されたインタフェースを提供するので、非同期動作の制御容易こと。

約束はまた、いくつかの欠点を有しています。まず第一に、あなたは約束をキャンセルすることはできません新しい缶が途中でキャンセルされていないと、それが直ちに実行されます。あなたは、コールバック関数、内部の約束スローエラーを設定しない場合は第二に、それは外部には反応しません。保留状態で、進捗が現在どこのステージ(完了を開始するか、近づい)を知る方法はありません第三に、。

使用
約束オブジェクトは、約束のインスタンスを生成するコンストラクタである
オブジェクトのインスタンスを作成約束

var promise = new Promise( function( resolve, reject) { //some code  if(//异步操作成功){ resolve(value); }else{ reject(error); } });

約束のコンストラクタは、パラメータとしての機能を受け入れ、二つのパラメータの機能は、展開する必要はありません、彼らはJavaScriptエンジンにより提供される二つの機能です、決意していると拒否します。

この関数は、パラメータとして配るために、成功したコール非同期操作時に「保留」の約束からのオブジェクトの状態の役割「」解決「」になり、非同期操作の結果を解決することです。

(すなわち、拒否保留中から変更)をパラメータとして、非同期操作が失敗したときに呼び出され、非同期動作エラーがあってもよいが、アウト渡す機能は、「失敗した」ことを約束「未完」からオブジェクトの状態の役割を拒否することです。

約束のインスタンス生成したら、状態によってコールバック関数解決の状態を指定してメソッドを拒否することができます

promise.then( function(value){ //success }, function(error){ //failure });

許容される方法は、次にも、コールバック関数のパラメータとして、コールバック関数の最初の状態は、オブジェクトが解決約束になったときに第二の機能であり、オブジェクトは、約束の状態を拒否になると、2番目のコールバックが呼び出されると呼ばれてもよいですオプションで、この2つの機能が約束をパラメータとして来たオブジェクトの値を取る提供する必要はありません。
約束のオブジェクトの簡単な例

function timeOut (ms) { return new Promise(function(resolve,reject) { return setTimeout(resolve,ms,"done"); }) } timeOut(3000).then( function(value){ console.log(value); })

タイムアウト法は、約束のインスタンスを返す結果が解決なった状態の約束インスタンス後の時間の指定された期間(ミリ秒)にわたって、一定期間後に発生する表し、それは、次いで、結合したメソッドコールバック関数をトリガします

約束は新しい直後に実行されます

let promise = new Promise(function(resolve, reject) { console.log('Promise'); resolve(); }); promise.then(function() { console.log('resolved.'); }); console.log('Hi!'); // Promise // Hi! // resolved

約束はすぐに新しいの後に行うので、第1の出力は約束です。その後、その後、メソッド指定されたコールバック関数、スクリプトがすべてのタスクが実行され、現在同期して実行され、それが最終的な出力を解決しました。

非同期ロードの絵あなたの例

function loadImageAsync (url) { return new Promise( function( resolve, reject){ var image = new Image(); image .onoad = function(){ resolve(image); }; image.onerror = function () { reject(new Error("could not load image at "+ url) ); }; image.src =url; }); } loadImageAsync(url).then( function (value) { console.log(value); })

約束は、画像をロードするための非同期操作を使用してラップします。負荷が成功すれば、それはそれ以外の場合は、メソッドを呼び出す拒否、解決メソッドを呼び出します。

例としては、Ajax操作オブジェクトの実装を約束します

var getJSON = function (url) { var promise = new Promise( function(resolve,reject ) { var XHR = new XMLHttpRequest(); XHR.open("GET",url); XHR.onreadystatechange = function () { if (this.readyState !==4) {return;} if(this.status == 200) { resolve(this.response); } else{ reject(new Error(this.statusText) ); } }; XHR.responseType = "json"; XHR.setRequestHeader("Accept","application/json"); XHR.send(); }); return promise; }; getJSON("posts.json").then(function(json){ console.log("Contents : "+json ); }, function(error) { console.log("出错了", error); }) ;

getJSON XMLHttpRequestがHTTP JSONデータの要求を発行するため、オブジェクトのカプセル化され、内部getJSON、機能および解決は関数呼び出しを拒否した場合に、パラメータを有することに留意すべき約束オブジェクトを返す;
解決コール場合機能パラメータで機能を拒否し、その後、それらの引数は、コールバック関数に渡されるパラメータは、機能を拒否典型的には、エラーオブジェクトのインスタンスがスローされたエラーを表し、関数は、正常値に解決追加パラメータとすることもできます約束の別の例。

var p1 = new Promise(function (resolve, reject) { // ... }); var p2 = new Promise(function (resolve, reject) { // ... resolve(p1); })

P1およびP2は、非同期操作の結果は、別の戻り非同期動作、すなわち、実施例の約束であるが、パラメータとしてメソッドP2はP1を解決します。
このとき、P1の状態がP2の状態を判断し、言うことです状態P1 P2と、に転送されます。状態P1が保留されている場合、状態は、コールバック関数P2はP1の変更を待ちます; p1の状態が解消または拒否された場合、その後、P2コールバック関数は直ちに実行されます。
呼び出しが解決するか拒否するかの約束の機能の実行パラメータを終了しないことに注意してください。

new Promise((resolve, reject) => { resolve(1); console.log(2); }).then(r => { console.log(r); }); // 2 // 1

解決(1)を呼び出した後、後者にconsole.log(2)が実行されると、最初に印刷されるであろう。約束は常に同期タスクでのイベントループの実行の現在のラウンド、後半ラウンドのサイクルの終わりに即座に解決されるためです。

プロミスミッションが完了し、一般的に、後続の呼び出しが解決または拒否するために、以降の動作は、メソッドを直接解決の裏に書かれ、または拒否されるべきではない次いで、内部に配置されるべきです。したがって、彼らの前のプラスreturn文で最高のは、これは偶然はないだろう。

new Promise((resolve, reject) => { return resolve(1); // 后面的语句不会执行 console.log(2); })

Promise.prototype.then()
プロミスの例示的な方法次に有する、たとえば、そのプロトタイプオブジェクトPromise.prototypeに記載の方法。彼の役割は、状態が約束インスタンスに変更されたときにコールバック関数を追加することです。上述したように、最初のパラメータは、コールバックメソッドは、状態が解決され、2番目のパラメータは、コールバック関数が状態を拒否されます。
thenf方法は、すなわち、次に、本方法は、再び、別のメソッドを呼び出し、チェーンを使用して記述することができる約束(プロミスない元のインスタンス)の新しいインスタンスを返します

getJSON("posts.json").then(function (json){ return post.json; }).then(function(post){ //... });

ターン指定する2つのコールバック関数では、完了意志機能後最初のバックは、2番目のコールバック関数に渡されるパラメータとして結果を返します。
チェーンの使用は、その後、あなたが呼ばれるためには、コールバック関数のセットを指定することができます。その後、コールバック関数の前に、それは(非同期操作です)約束やオブジェクトを返すことが可能であり、その後、コールバック関数の後に、そのオブジェクトの状態変化の約束を待つことになる、と呼ばれます。

getJSON("posts/1.json").then(function(post){ return getJSON(post.commentURL); }).then(function funA(comments) { console.log("resolved:" ,comments); }, function funB(err){ console.log("rejected:", err); });

コールバック関数を指定した第一の方法上記次いで第2の方法はコールバック関数を指定し、それは新しいオブジェクトの状態を待機する、オブジェクトが別の約束、この時点で返す約束を変更します。あなたが解決状態が拒否になった場合、それは、フナを呼び出すとなった場合、それはfunBを呼び出します。機能コードより簡潔に矢印:

getJSON("/post/1.json").then( post => getJSON(psot.commentURL) ).then( comments => console.log("resolved:",comments), err => console.log("rejected:" ,err) );


著者:startitunderground
リンクします。http://www.imooc.com/article/20580 BLOCK_ID = tuijian_wz?
出典:ムーのクラスのネットワーク

おすすめ

転載: www.cnblogs.com/danchaofan123/p/12014000.html