約束について!あなたはすべてを理解していますか?

Promiseは、将来終了するイベント(通常は非同期操作)の結果を保持する単なるコンテナーです。構文的に言えば、Promiseは非同期操作からメッセージを取得できるオブジェクトです。Promiseは統合されたAPIを提供し、さまざまな非同期操作を同じ方法で処理できます。コードをコピーする

1.Promiseオブジェクトには2つの主要な特性があります。

1)オブジェクトの状態は外界の影響を受けません。Promiseオブジェクトは、非同期操作を表します。保留中(進行中)、実行済み(成功)、拒否(失敗)の3つの状態があります。非同期操作の結果のみが現在の状態を判別でき、他の操作はこの状態を変更できません。
2)状態が変化すると、再び変化することはなく、この結果はいつでも取得できます。Promiseオブジェクトの状態が変更される可能性は、保留から実行済みと保留から拒否の2つだけです。この2つの状況が発生している限り、状態はフリーズし、変化しなくなります。この結果は常に維持されます。この時点で、解決済み(ファイナライズ済み)と呼ばれます。変更が発生した場合は、Promiseオブジェクトにコールバック関数を追加すると、この結果がすぐに得られます。これはイベントとは全然違います。イベントの特徴は、見逃した場合は聞くことができ、結果が出ないことです。コードをコピーする

2.約束の不利な点:

1)Promiseはキャンセルできません。一度作成するとすぐに実行され、途中でキャンセルすることはできません。
2)コールバック関数が設定されていない場合、Promise内でスローされたエラーは外部に反映されません。
3)保留状態の場合、現在どの段階にあるか(開始したばかりか、完了しようとしている)を知ることはできません。コードをコピーする

3.約束の使用法:

1)Promiseオブジェクトは、Promiseインスタンスを生成するためのコンストラクターです。

const KKBpromise = new Promise(function(resolve、reject){
  // ...いくつかのコード

  if(/ *非同期操作が成功しました* /){
    resolve(value);
  } そうしないと {
    拒否(エラー);
  }
});コピーコード

Promiseコンストラクターは関数をパラメーターとして受け入れ、関数の2つのパラメーターはresolveとrejectです。これらはJavaScriptエンジンによって提供される2つの関数であるため、自分でデプロイする必要はありません。

resolve関数の機能は、Promiseオブジェクトの状態を「unfinished」から「success」に(つまり、保留中から解決済みに)変更し、非同期操作が成功したときに呼び出され、非同期操作の結果をパラメーターとして渡すことです。この関数の機能は、Promiseオブジェクトの状態を「未完了」から「失敗」(つまり、保留から拒否)に変更し、非同期操作が失敗したときに呼び出され、非同期操作によって報告されたエラーをパラメーターとして渡すことです。

Promiseインスタンスが生成された後、thenメソッドを使用して、解決された状態と拒否された状態のコールバック関数をそれぞれ指定できます。栗を与える:

KKBpromise.then(function(value){
  // 成功
}、function(error){
  //失敗
});コピーコード

thenメソッドは、2つのコールバック関数をパラメーターとして受け入れることができます。最初のコールバック関数は、Promiseオブジェクトの状態が解決されたときに呼び出され、2番目のコールバック関数は、Promiseオブジェクトの状態が拒否されたときに呼び出されます。その中で、2番目の機能はオプションであり、提供する必要はありません。これらの関数は両方とも、Promiseオブジェクトから渡された値をパラメーターとして受け入れます。

関数pros(ms){
  新しいPromise((resolve、reject)=> {を返す
    setTimeout(resolve、ms、 'done');
  });
}
pros(100).then((value)=> {
  console.log(value);
});コピーコード

prosメソッドはPromiseインスタンスを返します。これは、一定期間後に発生する結果を表します。指定された時間(msパラメーター)の後、Promiseインスタンスの状態が解決され、thenメソッドにバインドされたコールバック関数がトリガーされます。

2)Promiseは、作成された直後に実行されます。例えば:

let promise = new Promise(function(resolve、reject){
  console.log( 'Pro');
  resolve();
});
promise.then(function(){
  console.log( '解決済み');
});
console.log( 'Hello Promise!');
// プロ
//こんにちはプロミス!
//解決しました

Promiseは作成直後に実行されるため、最初の出力はPromiseです。次に、thenメソッドで指定されたコールバック関数は、現在のスクリプトのすべての同期タスクが実行された後に実行されるため、最後に解決済みが出力されます。

場合によっては、resolveまたはrejectを呼び出した後、Promiseのミッションが完了します。後続の操作はthenメソッドに配置する必要があり、resolveまたはrejectの直後に記述しないでください。したがって、驚きがないように、それらの前にreturnステートメントを追加するのが最善です。

new Promise((resolve、reject)=> {
  resolve(1);を返します。
  //次のステートメントは実行されません
  console.log( '実行を続行');
})コードをコピーする

4.一般的に使用されるAPIを約束します。

1)Promise.all()メソッドは新しいpromiseオブジェクトを返します。これは、すべてのpromiseオブジェクトが成功したときに成功をトリガーし、その中のpromiseオブジェクトのいずれかが失敗すると、promiseオブジェクトの失敗がすぐにトリガーされます。 。この新しいpromiseオブジェクトが成功状態をトリガーした後、成功コールバックの戻り値としてすべてのpromise戻り値を含む配列を取ります。順序はパラメーターの順序と一致しています。この新しいpromiseオブジェクトが失敗状態をトリガーすると、失敗をトリガーした最初のpromiseオブジェクトのエラーメッセージは、その失敗エラーメッセージとして使用されます。Promise.allメソッドは、複数のPromiseオブジェクトの状態コレクションを処理するためによく使用されます。

kkb1 = new Promise((resolve、reject)=> {
 resolve( 'kkb1成功')
})

kkb2 = new Promise((resolve、reject)=> {
 resolve( 'kkb2成功')
})

kkb3 = Promse.reject( 'Failed')


Promise.all([kkb1、kkb2])
 .then((result)=> {
   console.log(result)// ['kkb1成功'、 'kkb2成功']
 })
 .catch((error)=> {
   console.log(エラー)
 })


Promise.all([kkb1、kkb3、kkb2])
 .then((result)=> {
   console.log(result)
 })
 .catch((error)=> {
   console.log(error)// '失敗'
 })コードをコピーする

2)Promise.raceの使用法はすべての使用法と同様です。Promse.raceメソッドは、その名前が示すように、レースを意味します。つまり、Promise.race([kkb1、kkb2、kkb3])の結果がすばやく取得されると、結果自体が成功状態か失敗状態かに関係なく、その結果が返されます。

kkb1 = new Promise((resolve、reject)=> {
  setTimeout(()=> {
    resolve( 'kkb1')
  }、1000)
})
 
kkb2 = new Promise((resolve、reject)=> {
  setTimeout(()=> {
    拒否( 'kkb2')
  }、500)
})
 
 
Promise.race([kkb1、kb2])
  .then((result)=> {
    console.log(result)
  })。catch((error)=> {
    console.log(error)//高速であるためkkb2を出力します
  })コードをコピーする

おすすめ

転載: blog.51cto.com/15069732/2575865