ES6の研究3:約束

約束の意味:

いわゆるはPromise、それは単にイベントが将来(通常は非同期動作)の結果にいつか終わる保持するコンテナです。

構文的には、約束がオブジェクトである、あなたはそれの非同期操作からメッセージを取得することができます。統一されたAPIを提供することを約束し、非同期操作の様々な同じように扱うことができます。

 

基本的な使い方を約束します:

Promiseコンストラクタは、パラメータとして関数をとり、関数の2つのパラメータはそれぞれresolvereject彼らはあなたが展開する必要はありません、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約束の一例であるが、方法のパラメータとして、すなわち、非同期動作の結果は、別の戻り非同期動作です。p2resolvep1

この時点でことに注意してくださいp1状態がに転送されますp2、と言う、p1状態は決定p2状態。場合p1状態はpending、その後、p2コールバック関数は待つだろうp1状態の変化;場合p1状態がすでにあるresolvedrejectedp2コールバック関数は直ちに実行されます。

 

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メソッドは、パラメータとして、アレイかかりp1p2p3プロミス、ない場合、次は最初に述べたと呼ぶことにする例であるPromise.resolve方法、プロミスインスタンスにパラメータ、さらに処理します。Promise.allメソッドのパラメータは、アレイではないかもしれないが、イテレータインターフェースを持っている必要があり、各部材は、プロミスのインスタンスを戻します。)

p状態はp1p2p3決定し、2例に分かれています。

(1)のみp1p2p3状態になっているfulfilledp状態になるであろうfulfilled。この場合p1p2p3アレイからなる戻り値は、に渡されるpコールバック関数。

(2)長いp1p2p3であることがありrejectedp状態になるrejected最初の場合は、rejectインスタンスの戻り値に渡されるpコールバック関数。

 

promise.race()

Promise.race新しいインスタンスにパッケージング方法も複数のインスタンスプロミス、プロミス。

CONST P = Promise.race([P1、P2、P3])。

上記のコードでは、限りp1p2p3最初の状態を変更するために、1つのインスタンスでは、p状態はそれに応じて変化します。変更することが最初のインスタンスの値を返すことを約束し、それが渡されるpコールバック関数。

Promise.raceパラメータおよびメソッドPromise.allインスタンスを約束されていない場合と同じように、それは最初に下記呼び出すPromise.resolve方法、プロミスインスタンスにパラメータを、さらなる処理。

ここでの例では、結果が指定された時間内に得られない場合、状態は、プロミスが変更され、あるrejectさもなければなりますresolve

CONST P = Promise.raceは([ 
  (フェッチ '/リソースその-とり得る-しばらく' )、
   新たな約束(関数(決意、リジェクト){ 
    たsetTimeout(() =>リジェクト(新しいエラー( '要求タイムアウトを「))、5000 
  })
])。

p個の
.then(にconsole.log) キャッチ(console.error)。

 

ORIGINAL http://es6.ruanyifeng.com/#docs/promise

おすすめ

転載: www.cnblogs.com/yangjie-space/p/11616314.html