まず、それはどのような約束しますか?
VaRののsayHello = 関数(名前、コールバック){ たsetTimeout(関数(){ にconsole.log(名前); コールバック(); }、 1000年)。 } のsayHello( "第一"、関数(){ のsayHello( "第二"、関数(){ のsayHello( "第3"、関数(){ にconsole.log( "終了" ) );} }); }); // 输出:第二第三端
約束は二つの問題を解決するために使用されます。
- コールバック地獄は、コードを維持するのは難しい、しばしばこの現象の第2の機能の最初の入力の出力の関数です。
- 複数の要求を同時にサポートすることができます約束、同時データ取得要求
- この約束は、それ自体が、その約束が非同期であると言うことができない非同期問題を解決することができます
二、ES6約束の使用Daquanの
約束は、コンストラクタで、自分自身のすべて、拒否、これらのおなじみの方法を解決し、試作品のキャッチ方法は、そこです。
Pは=新しい新しいプロミスLET((解決、拒否)=> { //いくつかの非同期操作を行う のsetTimeout(()=> { にconsole.log( '実行完了'); 解決( '私が成功した!!'); } 2000); });
- 解決:成功の後、非同期操作のコールバック関数を
- 拒否:非同期操作は、コールバック関数を失敗しました
使用後、チェーンオペレーション
したがって、表面上が、簡略化することができるプロミス層が書き込まれたコールバックが、本質的に、プロミス「状態」の本質、状態を維持するための方法であり、その結果よりもコールバック関数を転送するタイムリーコールバック呼び出しへ送信状態これは、単純な、柔軟でより多くのでなければなりません。だから、約束はこれで正しいのシーンを使用します。
p.then((データ)=> { にconsole.log(データ); }) .then((データ)=> { にconsole.log(データ); }) .then((データ)=> { にconsole.log(データ); });
使用を拒否:
私たちは、その後にキャプチャし、その後のコールバックケース実行できるように、拒否されたとして約束フラグ「失敗を。」次のコードを見てください。
P =新しい新しい約束のlet((解決、拒否)=> { //いくつかの非同期操作を行う のsetTimeout(関数(){ varはNUM = Math.ceil(Math.random()* 10); //ランダム生成1-10番号 IF(NUM <= 5){ 解決(NUM); } 他{ 拒否( 'デジタル多すぎる'); } }、2000); }); p.then((データ)=> { にconsole.log( '解決'、データ); }、(ERR)=> { にconsole.log( '拒否'、ERR); } );
キャッチ使い方
私たちは、それはそれをどうするかで、その後、対象プロミス方法に加えて、キャッチ方法があることを知っていますか?
実際には、2番目の引数と同じですが、拒否コールバックを指定するために使用されます。使用方法は、このようなものです:
p.then((データ)=> { にconsole.log( '解決'、データ) })。キャッチ((ERR)=> { ()ERR、 '拒否'にconsole.log })
効果と同じ内の2番目のパラメータで記述し、それはまた、第二役割があります。例外がスローされた場合、(コード間違った)をコールバック決意を(つまり、その後、上記の最初のパラメータです) 、それが立ち往生JSを文句はありませんが、このキャッチ方法に入ります。
p.then({(データ)=> '解決'にconsole.log(データ) はconsole.log(someDataが); //本明細書someDataがの定義 }) .catch((ERR)=> { にconsole.log ( '拒否'、ERR) })
コールバックの解決では、我々は(someDataが)にはconsole.log;およびsomeDataが、この変数が定義されていません。私たちはここにコンソールのエラーで直接コードを実行するために、約束していない場合は、ダウンを実行しないでください。しかし、ここで、あなたはこの結果を得ます:
それはどこへ行く方法をキャッチするには行きましたが、エラーの原因は、理由パラメータに広がりました。私たちのtry / catch文で与えられていないと、エラーコード、があっても同じ機能を持っています
すべての使用:優先コールバックを実行するために、遅い実行されています。
最終目標リターンプロミスの値であると考えられるすべてのパラメータの配列を、受信
全てパラレル方式の約束は、非同期操作を実行する能力を提供し、すべての非同期コールバック操作の前に完全な実行が行われます。
以下の例を参照してください。
せPromise1は=新しい新しいプロミス(関数(解決、拒否){}); せPromise2 =新しい新しいプロミス(関数(解決、拒否){}); せPromise3 =新しい新しいプロミス(関数(解決、拒否){}); LET P Promise.all =([Promise1、Promise2、Promise3]) p.then(関数(){ // 3つが成功し、成功 }、{ //長い故障、障害があるように })
レース使用:優先コールバックを実行するために、速く走ります
レース使用シナリオは、次のように例えば、我々は、タイムアウトを設定する非同期要求レースを使用し、タイムアウト後に、対応する動作を行うことができます。
//は、画像リソース要求 機能requestImg(){ VARのP =新しい新しいプロミス((解決、拒否)=> { img.onload =関数(){ 解決(IMG)を; } img.src = '画像パス'; }); 戻りP; } //要求タイミングの遅延関数 関数タイムアウト(){ VARのP =新しい新しいプロミス((解決、拒否)=> { たsetTimeout(()=> { 拒否(「画像要求タイムアウト「); }、5000) }); ; P戻り } 。Promise.race([requestImg()、タイムアウト()]次に、((データ)=> { にconsole.log(データ); 。})キャッチ((ERR )=> { にconsole.log(ERR); }) )