約束の意味:
いわゆるはPromise
、それは単にイベントが将来(通常は非同期動作)の結果にいつか終わる保持するコンテナです。
構文的には、約束がオブジェクトである、あなたはそれの非同期操作からメッセージを取得することができます。統一されたAPIを提供することを約束し、非同期操作の様々な同じように扱うことができます。
基本的な使い方を約束します:
Promise
コンストラクタは、パラメータとして関数をとり、関数の2つのパラメータはそれぞれresolve
とreject
。彼らはあなたが展開する必要はありません、JavaScriptエンジンにより提供される二つの機能があります。
関数は「成功」と「未完」の約束からのオブジェクトの状態の役割を解決するためにあるパラメータとして配るために、成功したコール非同期操作、および非同期操作の結果に、(すなわち、解決係属中から変更)。
パラメータがアウト渡すように機能(すなわち、拒否された保留中の変更)「失敗」を「未完」プロミスからオブジェクトの状態の役割を拒否することで、非同期操作が失敗したときに呼び出され、非同期動作のエラーがあってもよいです。
Promise
インスタンス生成後は、次のことができますthen
方法の指定resolved
状態とrejected
コールバックの状態を。
constの約束= 新しい約束(機能(解決、拒否){ // ...いくつかのコード であれば(/ * 异步操作成功* / ){ 解決(値); } 他{ エラー(拒否); } }); promise.then(関数(値){ // 成功 }、関数(誤差){ // 故障 })。
新しい約束が直ちに実行されます後
VaRの約束= 新しいプロミス(関数(決意、リジェクト){ にconsole.log( 'プロミスインスタンス' ); 解決(); }); promise.then(関数(){ にconsole.log( '解決結果' ); }); 用(VAR ; iが100 <I ++は、I = 0 ){ にconsole.log(I)。
} / * プロミスインスタンス 1 2 3 ... 99 100 解消結果 * /
resolve
パラメータ値の正常な機能に加えて、だけでなく、このようなこのような約束の他の例であってもよいです。
CONST P1 = 新しいプロミス(関数(決意、リジェクト){ // ... })。 CONST P2 = 新しいプロミス(関数(解決、リジェクト){ // ... 解決(P1); })
上記のコード、p1
およびp2
約束の一例であるが、方法のパラメータとして、すなわち、非同期動作の結果は、別の戻り非同期動作です。p2
resolve
p1
この時点でことに注意してくださいp1
状態がに転送されますp2
、と言う、p1
状態は決定p2
状態。場合p1
状態はpending
、その後、p2
コールバック関数は待つだろうp1
状態の変化;場合p1
状態がすでにあるresolved
かrejected
、p2
コールバック関数は直ちに実行されます。
promise.prototype、その後、()
約束インスタンスが持つthen
メソッド、即ち、then
プロトタイプオブジェクトのメソッドが定義されているPromise.prototype
上に。その役割は、状態変化約束インスタンスに対してコールバック関数を追加することです。
上述したように、then
方法の第1引数であるresolved
状態のコールバック関数、及び二番目のパラメータ(オプション)はrejected
、コールバックステータス。
then
この方法は、新しい返すPromise
インスタンス(ノートではなく、オリジナルのPromise
インスタンス)。すなわち、チェーンを使用して記述することができるthen
方法は、別の呼び出しの後にthen
方法。
getJSON( "/ posts.json")を(関数(JSON){ 戻りjson.post; })。次に、(関数(ポスト){ // ... })。
上記のコードは、使用then
方法、シーケンスを指定された2つのコールバック関数を。最初のコールバックが完了した後、結果は、2番目のコールバックに渡されたパラメータとして返されます。
チェーンの使用はthen
、あなたが呼ばれるためには、コールバック関数のセットを指定することができます。このとき、コールバック関数の前に、の可能な戻り依然として存在しているPromise
オブジェクト(つまり、非同期操作です)、その後、コールバック関数の後に、それは待つだろうPromise
呼び出されますが、オブジェクトの状態が変化。
。getJSON( "/ポスト/ 1.json")、次いで(関数(POST){ 戻り、getJSON(post.commentURL) 。次に、(})関数{(コメント) はconsole.log( "解決" 、コメント); } 、関数(ERR){ にconsole.logは( "拒否:" 、ERR); });
上記のコードでは、最初のthen
メソッド指定されたコールバック関数は、別の戻りPromise
オブジェクト。このとき、第2 then
の方法指定されたコールバック関数は、新しいのを待ちますPromise
オブジェクトの状態が変化します。変更した場合resolved
、ステータスが変化した場合、それは、最初のコールバックを呼び出してrejected
、2番目のコールバック関数を呼び出します。
矢印の機能場合は、上記のコードはより簡潔に書くことができます。
getJSON( "/post/1.json" ).then(
POST => getJSON(post.commentURL) ).then(
コメント =>はconsole.log( "解決" 、コメント)、 ERR =>はconsole.log( "拒否: " 、ERR) );
promise.prototype.catch()
getJSON( '/ posts.json')。次に、(関数は、(ポスト){ // ... })。キャッチ(関数(誤差){
// 前コールバックgetJSON処理中にエラーが発生して実行 (にconsole.logを'エラーが発生した!' 、エラー); });
上記のコードでは、getJSONメソッドは、オブジェクトの状態が解決なると、メソッド指定されたコールバック関数が呼び出される、プロミスオブジェクトを返します。
非同期操作がエラーをスローした場合、拒否された状態が変化し、このエラーに対処するために、キャッチメソッド指定されたコールバック関数を呼び出します。また、この方法は、操作がエラーをスローした場合、それはキャッチ法をキャッチされ、コールバック関数を指定しました。
p.then((val)で=>はconsole.log( '成就:' 、val)で) 。キャッチ((ERR)=>はconsole.log( '拒否' )ERR)。 // 等同于 p.then( '成就:'(val)で=>はconsole.log(ヴァル)) .then(ヌル、(ERR)=>はconsole.log( "拒否:"、ERR));
一般的に、ないthen
メソッドコールバックの内部に定義された状態を拒否する(すなわち、then
二番目の引数)が常に使用されるcatch
方法。
// 悪い 約束 .then(関数(データ){ // 成功 }、関数(ERR){ // エラー })。 // 良い 約束 .then(関数(データ){ // CB // 成功 }) 。キャッチ(関数(ERR){ // エラー })。
上記のコードでは、2回目の書き込みが最初の書き込みよりも優れている、書き込みが第二の理由は、上記捕捉することができるあるthen
方法は、エラーを行う(同期書き込みに近いですtry/catch
)。したがって、常に使用することをお勧めしますcatch
代わりに使用する方法、then
二番目のパラメータの方法を。
promise.protype.finally
finally
かかわらず、プロミス最終状態を標的化するために使用される方法の動作は、指定され実行されます。標準的な方法はES2018を導入しています。
約束 .then(結果 => {...}) 。キャッチ(エラー=> {...}) 。最終的に、(()=> {...})。
promise.all
Promise.all
新しいインスタンスにパッケージ複数のインスタンスプロミス、プロミス方法。
CONST P = Promise.all([P1、P2、P3])。
上記のコードは、Promise.all
メソッドは、パラメータとして、アレイかかりp1
、p2
、p3
プロミス、ない場合、次は最初に述べたと呼ぶことにする例であるPromise.resolve
方法、プロミスインスタンスにパラメータ、さらに処理します。(Promise.all
メソッドのパラメータは、アレイではないかもしれないが、イテレータインターフェースを持っている必要があり、各部材は、プロミスのインスタンスを戻します。)
p
状態はp1
、p2
、p3
決定し、2例に分かれています。
(1)のみp1
、p2
、p3
状態になっているfulfilled
、p
状態になるであろうfulfilled
。この場合p1
、p2
、p3
アレイからなる戻り値は、に渡されるp
コールバック関数。
(2)長いp1
、p2
、p3
であることがありrejected
、p
状態になるrejected
最初の場合は、reject
インスタンスの戻り値に渡されるp
コールバック関数。
promise.race()
Promise.race
新しいインスタンスにパッケージング方法も複数のインスタンスプロミス、プロミス。
CONST P = Promise.race([P1、P2、P3])。
上記のコードでは、限りp1
、p2
、p3
最初の状態を変更するために、1つのインスタンスでは、p
状態はそれに応じて変化します。変更することが最初のインスタンスの値を返すことを約束し、それが渡されるp
コールバック関数。
Promise.race
パラメータおよびメソッドPromise.all
インスタンスを約束されていない場合と同じように、それは最初に下記呼び出すPromise.resolve
方法、プロミスインスタンスにパラメータを、さらなる処理。
ここでの例では、結果が指定された時間内に得られない場合、状態は、プロミスが変更され、あるreject
さもなければなりますresolve
。
CONST P = Promise.raceは([ (フェッチ '/リソースその-とり得る-しばらく' )、 新たな約束(関数(決意、リジェクト){ たsetTimeout(() =>リジェクト(新しいエラー( '要求タイムアウトを「))、5000 ) }) ])。 p個の .then(にconsole.log) 。キャッチ(console.error)。