約束する
約束は将来の物事が終わる保持するオブジェクトであり、あなたは非同期操作からメッセージを取得することができ、それは常に結果を返し、成功するか失敗する可能性があり、漢は発電のための構造として理解することができますプロミス例。
プロミスオブジェクトは、次の3つの状態があり、非同期操作です:保留/成就/拒否します
オブジェクトの状態が変化を約束:保留からにして、保留中から拒否さ成就へ
あなたは約束をキャンセルすることはできません。エラーの約束の内側にスローコールバックを設定していない場合は、外部に反映させることができない、進捗状況をステップアップするために知る方法を保留していないとき
const promise = new Promise(function(resolve, reject) {
if(success) {
resolve(value)
} else {
reject(error)
}
})
関数がパラメータとして受け取るコンストラクタを約束し、2つのパラメータは、関数解決であり、拒否します:
- 呼び出しが成功時に成就、非同期動作を約束、非同期動作パラメータの結果としてアウト渡すオブジェクトのペンディング状態から呼び出される関数を解決します。
- 機能が動作拒否、保留中の約束からのオブジェクトの状態は拒否となり、
プロミス例を生成した後、方法は、次に使用されるコールバック関数の解決状態と拒否された状態を指定することができます。
promise.then(function(value){
console.log('success')
},function(error){
console.log('error')
})
次いで、引数ように、2つのコールバック関数を受ける:オブジェクトの最初のパラメータは、状態約束が解消になったときに呼び出し、オブジェクトが拒否状態の約束になったときに第二パラメータが呼び出され、(オプションの二番目のパラメータ)
約束は新しい直後に実行されます
let promise = new Promise(function(resolve, reject) {
console.log('Promise')
resolve()
})
promise.then(function() {
console.log('resolved')
})
console.log('Hi')
//Promise
//Hi
//resolved
新しい約束が直ちに実行されますので、最初の出力を約束して、コールバック関数法を指定した後、スクリプトがすべてのタスクが実行され、現在の同期の後に実行されますが、それは最終的な出力を解決しました。
Promise.prototype.then()
> * Promise实例的then方法是定义在原型对象上的,其作用是为Promise实例添加状态改变时的回调函数resolved-rejected; > * 其then方法返回的是一个新的Promise实例(非原Promise实例),可以采用then的链式调用,即then后面再调then方法 > * 采用链式的then可以指定一组按照顺序调用的回调函数,前一个回调函数可能返回一个还是Promise对象,这时一个回调函数就会等该Promise对象的状态发生变化,才会被调用;
getJSON('/*').then(function(post){
return getJSON(post.commentURL)
}).then(function funA(){
console.log('resolved:', comments)
}, function funB(err){
console.log('rejected:', err)
})
PS:最初に、指定したコールバック関数は、プロミスオブジェクトを返し、その後、2番目に指定されたコールバック関数は、それがてfuncAを呼び出すことを決議になった場合、ステータスの変更が拒否され、変更するには新しい約束の件名を待ちます私たちは、funcBのを呼び出します
***Promise.prototype.catch()
> Promise.prototype.catch()是.then(null, rejection)的别名,用于指定发生错误时的回调函数;
getJSON('*').then(function(posts){
}).catch(function(){
console.log('error')
})
getJSONメソッドが解決するオブジェクトの状態と、プロミスオブジェクトを返す、方法指定されたコールバック関数が呼び出され、非同期操作がエラーをスローした場合、ステータスの変更が拒否された、キャッチメソッド指定されたコールバック関数を呼び出します。また、この方法は、実行した場合、エラーをスローし、コールバック関数を指定し、キャッチ法によって捕捉されます。
p.then(val => console.log('fulfilled:', val))
.catch(err => console.log('rejected:', err))
等价
p.then(val => console.log('fulfilled:', val))
.then(err => console.log('rejected:', err))
プロミスエラーオブジェクトが、不動産バブルを持っている、それが今までに撮影されるまで、パスバックされているだろう、そのエラーは常にcatch文の下でキャプチャされます。
Promise.prototype.finally()
> finally方法用于指定不管Promise对象最后状态如何,都会执行的操作。
Promise.all
> Promise.all(iterable)方法返回一个Promise实例,此实例在iterable参数内所有的promise都resolved或参数中不包含promise时回调完成,若参数中有一个rejected,此实例回调失败reject,失败原因是第一个失败promise的结果
let t1 = new Promise((resolve,reject)=>{
resolve("t1-success")
})
let t2 = new Promise((resolve,reject)=>{
resolve("t2-success")
})
let t3 =Promise.reject("t3-error");
Promise.all([t1,t2,t3]).then(res=>{
console.log(res)
}).catch(error=>{
console.log(error)
})
//打印出来是t3-error
例えば、複数の非同期処理を扱う際に非常に便利なPromse.all、データのページが、これが唯一のローディングアイコンが表示する前に、後で、バック通常表示を来た二つ以上のAJAXを待つ必要があります。
得られた注文データは、P2にP1の結果は後で取得よりも、Promise.allが一貫している、すなわち、フロントP1結果を受信Promise.all成功した結果の配列内の配列の順序。プロセスデータ要求の前端に、時には複数の要求が発生し、シーンを取得し、Promise.allを使用して、要求に応じてデータシーケンスを使用して、
Promise.race(反復可能)
> Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。 > Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。
リファレンス&感謝: